apache2 перенаправление по умолчанию, но не виртуальный хост
Я пытаюсь настроить новый сервер с несколькими виртуальными хостами, но также так, чтобы, если запрашиваемое 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
В случае, если я не был достаточно ясен:
Что-нибудь запрошенное с моего сервера что-нибудь, что-либо, что-либо, должно быть перенаправлено на 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, он перенаправляется в виртуальный хост по умолчанию, даже если для него есть виртуальный хост. Другие fqdn, которые не совпадают с серверами fqdn, работают так, как я планировал.
1 ответ
Решение для достижения того, что я изначально хотел, заключается в том, что 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>
Теперь это работает вместе с другими виртуальными хостами, которые также работают.