Я не совсем понимаю разницу между 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-адресе, например, при перенаправлении для списка каталогов.