Почему это определение VirtualHost активируется, когда ServerName не совпадает? [duplicate]

На этот вопрос уже есть ответ здесь:

У меня есть сервер httpd24, который я хочу использовать для сервера нескольких доменов.

У меня есть 3 определения VirtualHost.

<VirtualHost *:443>
   ServerName one.example.com
   # SSL stuff
   DocumentRoot "/opt/rh/httpd24/root/var/www/one
</VirtualHost>

<VirtualHost *:443>
   ServerName two.example.com
   # SSL stuff
   DocumentRoot "/opt/rh/httpd24/root/var/www/two
</VirtualHost>

<VirtualHost _default_:443>
   Redirect / https://two.example.com
</VirtualHost>

Идея в том, что если ввести точный url one.example.com или two.example.com, то они получат соответствующие страницы. Если вводится любой другой домен, я хочу перенаправить его на https://two.example.com url.

Однако я обнаружил, что если я ввожу https://three.example.com, то не получаю перенаправления, вместо этого выдается контент для one.example.com.

Обратите внимание, что https://two.example.com работает, как и ожидалось. Моя проблема в том, что я ожидаю, что неизвестные домены будут перенаправлены, но вместо этого они разрешаются как one.example.com.

RPM, который я установил изначально, был httpd24-httpd-2.4.27-8.el6.1.x86_64.

Есть идеи, что происходит?

1
задан 2 July 2019 в 04:21
1 ответ

Первая запись виртуального хоста обычно становится виртуальным хостом по умолчанию , который будет использоваться для обработки запросов, которые не соответствуют последующим записям виртуального хоста
(упрощенно; https://httpd.apache.org/docs/2.4/vhosts/details.html дает гораздо более подробное объяснение ...)

Строка _default_ в записи VirtualHost - это просто псевдоним для * , на практике обычно не делает конкретную запись VirtualHost значением VirtualHost по умолчанию, если это не первое определение. .

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

<VirtualHost _default_:443>
   Redirect / https://two.example.com
   # ServerName not needed
   # Any vhost that includes the magic _default_ wildcard is given the same ServerName as the main server. 
   # SSL stuff
</VirtualHost>

<VirtualHost *:443>
   ServerName one.example.com
   # SSL stuff
   DocumentRoot "/opt/rh/httpd24/root/var/www/one
</VirtualHost>

<VirtualHost *:443>
   ServerName two.example.com
   # SSL stuff
   DocumentRoot "/opt/rh/httpd24/root/var/www/two
</VirtualHost>
1
ответ дан 3 December 2019 в 23:03

Теги

Похожие вопросы