Назад | Перейти на главную страницу

Разница между ServerName и ServerAlias ​​

Я не совсем понимаю разницу между ServerName и ServerAlias. Похоже, что оба они работают как настройки имени хоста, за исключением того, что ServerAlias ​​работает только в теге <VirtualHost>.

То есть я могу:

ServerName www.domain1.com
ServerName www.domain2.com

или:

<VirtualHost *:80>
ServerName www.domain1.com
ServerName www.domain2.com
</VirtualHost>

и оба домена работают на одном устройстве. Могу ли я использовать в этом случае ServerName или ServerAlias?

В Название сервера директива

Имя хоста и порт, которые сервер использует для идентификации себя

Пока ServerAlias является

Альтернативные имена для хоста, используемые при сопоставлении запросов к виртуальным хостам имени

Учитывая vhost, настроенный как

 ...
 ServerName example.com
 ServerAlias www.example.com foo.example.com *.somewherelse.org
 ...

Apache ответит на example.com, www.example.com foo.example.com и что-нибудь в .somewherelse.org с этим VirtualHost

Одно ключевое отличие, которое я обнаружил экспериментально (исходя из необходимости), заключается в том, что при использовании с поддоменами с подстановочными знаками (например, «* .mycompany.com» и «* .mycompany.net») подстановочный знак должен быть указан как ServerAlias ​​и не ServerName.

Я не пробовал это с не-SSL, но с SSL это было так (для меня). Я остановился на конфигурации:

Listen *:8443    
NameVirtualHost *:8443
SSLStrictSNIVHostCheck off

<VirtualHost *:8443>
    ServerName mycompany.com
    ServerAlias *.mycompany.com
    ...
</VirtualHost>

<VirtualHost *:8443>
    ServerName mycompany.net
    ServerAlias *.mycompany.net
    ...
</VirtualHost>

При использовании «ServerName * .mycompany.net» всегда использовался первый виртуальный хост. Это был не просто сертификат, который он переписывал и логику проксирования.

Вполне возможно, что это происходит только с SSL, так как есть целая куча других вещей, как указано в SSL с виртуальными хостами с использованием SNI и многие потоки ServerFault. Следование всем советам в этом было последним аспектом чесания головы.

Я пришел в эту ветку, чтобы попытаться понять, почему была разница, и, признаться, я подхожу ближе, но не совсем понимаю.

В моем случае ServerName, кажется, делает немного меньше (не обнаруживается при поиске виртуального хоста), а не больше.

Выполнение "apacectl -S | httpd -S" согласно совету Иэна дает:

wildcard NameVirtualHosts and _default_ servers:
*:8443                 is a NameVirtualHost
         default server mycompany.com (/etc/httpd/conf/httpd.conf:1100)
         port 8443 namevhost mycompany.com (/etc/httpd/conf/httpd.conf:1100)
                 wild alias *.mycompany.com
         port 8443 namevhost mycompany.net (/etc/httpd/conf/httpd.conf:1164)
                 wild alias *.mycompany.net

Изменить: (добавление ServerName с подстановочным знаком для полноты)

wildcard NameVirtualHosts and _default_ servers:
*:8443                 is a NameVirtualHost
         default server *.mycompany.com (/etc/httpd/conf/httpd.conf:1040)
         port 8443 namevhost *.mycompany.com (/etc/httpd/conf/httpd.conf:1040)
         port 8443 namevhost *.mycompany.net (/etc/httpd/conf/httpd.conf:1105)

Примечание: слово «wild» в строке псевдонима в первом случае (с использованием ServerAlias) происходит от apache и не отображается во втором (с использованием ServerName) - я подозреваю, что это важно.

Кроме того, если я удалю «ServerName» из второго VirtualHost и просто использую псевдоним, следуя совету «должно быть только одно ServerName», то запрос теряется - кажется, автоматически перенаправляется на »https://test.mycompany.net:8443"- поскольку (в моем случае) 8443 не отображается извне (nat'd), он не работает. Да, я знаю, что для 443 это может сработать, но, возможно, показывает, что происходит что-то еще.

Так что, возможно, не ответ на вопрос, а небольшая документация для кого-то, кто борется с подобной настройкой.

Имея дело с программным обеспечением, часто важно иметь одну-единственную точку истины. ServerName можно считать «настоящим» каноническим именем хоста. ServerAlias не является.

ServerName делает все, что ServerAlias делает, и немного больше. Рекомендуется установить только одно имя сервера, поскольку должно быть только одно «каноническое» значение. Если ServerName не установлен явно, httpd определит имя самостоятельно.

ServerAlias с другой стороны, это просто псевдоним и может использоваться только в контексте VirtualHost. Их может быть сколько угодно.

Если сайт обслуживается по HTTPS, то ServerName должно соответствовать одному из имен, содержащихся в сертификате. Если ваш сертификат был создан для www.example.org, но в вашей конфигурации указано:

ServerName foo.example.org
ServerAlias www.example.org

Тогда Apache будет жаловаться на следующую ошибку:

10 декабря 13:23:45 web1 httpd [1234]: [предупреждение] Общее имя сертификата сервера RSA (CN) `www.example.org 'НЕ соответствует имени сервера !?

ServerName - это имя, которое apache будет использовать, когда ему нужно использовать собственное имя в URL-адресе, например, при перенаправлении для списка каталогов.