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

mod_rewrite - RewriteCond, если% {HTTP_HOST} НЕ является каким-либо ServerName / ServerAlias

Я хочу знать, можно ли создать условие перезаписи, если% {HTTP_HOST} НЕ является ServerName или любым из перечисленных ServerAlias.

Моя цель - перенаправить любые запросы, сделанные в домен, который не указан как ServerName, ServerAlias ​​'или прямо на IP (http://1.1.1.1, https://1.1.1.2. и т.д...).


В настоящее время я добиваюсь этого, выполняя следующие действия в рамках перенаправления без SSL на SSL. После моих правил перенаправления без SSL на SSL у меня есть правило перехвата всех, где, если {HTTP_HOST} не является example.com, то перенаправлять на мой реальный домен.

У меня есть аналогичные правила перезаписи для моего SSL-трафика, где у меня есть правило перехвата всех после моих правил перезаписи не из WWW в WWW.

<VirtualHost *:80>
ServerName  domain1.com
ServerAlias domain2.com domain3.com
DocumentRoot /home/domain/public_html
RewriteEngine on
RewriteCond %{SERVER_NAME} =domain1.com [OR]
RewriteCond %{SERVER_NAME} =domain2.com [OR]
RewriteCond %{SERVER_NAME} =domain3.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [L,NE,R=permanent]
RewriteCond %{HTTP_HOST} !^example\.com$
RewriteRule ^(.*)$ https://domain1.com$1 [R=301,NC]
</VirtualHost>

Мне любопытно, есть ли лучшая реализация для последнего правила перезаписи, если HTTP_HOST НЕ является ни одним из перечисленных ServerAlias ​​или ServerName.

Мое веб-приложение используется для простого тестирования сети (ping my ip, traceroute и т. Д.), Поэтому несколько IP-адресов легко доступны для пользователя. Я просто хочу убедиться, что любой сделанный запрос, который не использует один из перечисленных адресов серверов или отправляется непосредственно на IP-адрес, перенаправляется на мой основной домен. Вышеупомянутое работает, я просто хочу знать, есть ли лучший способ.

Вы слишком много думаете об этом. Вам не нужно помещать всю логику в RewriteConds.

Когда Apache получает запрос на хост, который не соответствует ни одному из ServerName или ServerAlias директивы в любом из VirtualHosts, он будет использовать VirtualHost по умолчанию, то есть тот, который первым в конфигурации. Поэтому просто поместите свое правило перезаписи в отдельный VirtualDomain и убедитесь, что оно загружено первым, либо указав его первым в файле конфигурации, либо назвав его, например. `00-default.conf 'в каталоге, в котором вы храните свои VirtualHosts.

Поскольку конфигурация этого VirtualHost будет использоваться только тогда, когда кто-то подключается и использует доменное имя, которое не указано иначе, вам не нужно отрицать какие-либо другие доменные имена. Конфигурация может быть просто

<VirtualHost *:80>
ServerName  default.example.net
DocumentRoot /home/domain/public_html
RewriteEngine on
RewriteRule ^(.*)$ https://example.com$1 [R=301,NC]
</VirtualHost>

Видеть https://serverfault.com/a/520201/120438 для более подробного объяснения того, как Apache выбирает, какой VirtualHost использовать.