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

перенаправление 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


На случай, если я не совсем понял:

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, которые также работают.