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>

Теперь это работает вместе с другими виртуальными хостами, которые также работают.

Другие вопросы по тегам