Я пытаюсь настроить новый сервер с несколькими виртуальными хостами, но также так, что если запрошенный fqdn не соответствует виртуальному хосту, запрос перенаправляется на http://example.com/log.php?url=fqdn
У меня есть перенаправление хоста по умолчанию по желанию, однако виртуальный хост, который я определил, не работает.
Я тестирую на другом хосте и curl -I http://hostname.example.com:8080/
в командной строке, чтобы прочитать заголовки html и напрямую проверить заголовок перенаправления, а не следить за ним в браузере (чтобы избежать проблем с кешированием).
Я определил виртуальный хост как fqdn сервера, но когда я использую curl для запроса этого виртуального хоста, меня перенаправляют. Если я запрашиваю сервер с любым другим именем, для которого не определен виртуальный хост, я также перенаправляюсь.
версия apache - 2.2.16 на ubuntu
Конфигурация (объединенная по порядку из пары разных файлов) выглядит следующим образом:
Listen 8080
NameVirtualHost *
<VirtualHost _default_>
ServerAdmin webmaster@zercat.net
RewriteEngine On
RewriteRule ^(.*)$ http://example.com/log.php?url=%{HTTP_HOST}$1 [R=302,L]
</VirtualHost>
<VirtualHost *>
<Directory "/var/www">
allow from all
Options Indexes
</Directory>
DocumentRoot /var/www
ServerName hostname.example.com
</VirtualHost>
Я также пробовал значения ServerName для hostname.example.com:* и hostname.example.com:8080
На случай, если я не совсем понял:
something.anything.any / что-то, запрошенное с моего сервера, должно перенаправлять на example.com/log.php?url=anything.anything.any/something
foo.example.com (не определен как VirtualHost), запрошенный с моего сервера, должен перенаправлять на example.com/log.php?url=foo.example.com
hostname.example.com (определенный как VirtualHost), запрошенный с моего сервера, должен возвращать html-документ
anothername.example.com (также определяемый как VirtualHost), запрошенный с моего сервера, должен возвращать html-документ
Оказывается, поскольку серверы владеют fqdn, это hostname.example.com, который перенаправляется на VirtualHost по умолчанию, даже если для него есть именованный VirtualHost. Другие fqdn, которые не совпадают с fqdn серверов, работают так, как я предполагал.
Решение для достижения того, что я изначально хотел, а именно, чтобы fqdn сервера отображал страницу, но любой fqdn, для которого не было задано имя VirtualHost, будет перенаправлен, как указано выше, довольно просто, как только я понял, в чем проблема.
Поскольку fqdn сервера всегда собирался отображать VirtualHost по умолчанию, независимо от того, был ли определен какой-либо именованный VirtualHost для fqdn, это означало, что решение нужно было записать в VirtualHost по умолчанию.
Поэтому я добавил условие перезаписи, которое применяет исходное правило перезаписи, если имя хоста не соответствует моим серверам fqdn. Кроме того, поскольку я использую нестандартные порты, было необходимо определить порты в условии, поскольку% {HTTP_HOST} включает номер порта. Я сделал это, опционально разрешив любой номер порта после fqdn, потому что позже я могу изменить порт сервера.
<VirtualHost _default_>
ServerAdmin webmaster@zercat.net
RewriteEngine On
RewriteCond %{HTTP_HOST} !(^hostname\.example\.com[:0-9]*$) [NC]
RewriteRule ^(.*)$ http://example.com/log.php?url=%{HTTP_HOST}$1 [R=302,L]
<Directory "/var/www">
allow from all
Options Indexes
</Directory>
DocumentRoot /var/www
</VirtualHost>
Теперь это работает вместе с другими именами VirtualHosts, которые также работают.