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

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

У меня есть сервер 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.

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

Первая запись виртуального хоста обычно становится виртуальный хост по умолчанию который будет использоваться для обработки запросов, которые не соответствуют последующим записям виртуального хоста
(упрощенный; 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>