Правило mod_rewrite для перенаправления всех запросов, кроме одного определенного пути

Я пытаюсь перенаправить все запросы в мой домен в другой домен, используя mod_rewrite в объявлении Apache 2.2 VirtualHost. Есть одно исключение - я бы хотел, чтобы все запросы к /audioпути не перенаправлялись.

Я написал RewriteCond и RewriteRule, чтобы сделать это, но это не совсем правильно, и я не могу понять, почему. Регулярное выражение содержит отрицательный взгляд на строку «/ audio», но по некоторым причинам это не соответствует. Вот определение:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*\.)?mydomain\.net(?!/audio) [NC]
RewriteRule ^(.*)$ http://www.newdomain.net [L,R=301]

Если я изменю RewriteCond на:

RewriteCond %{HTTP_HOST} ^(.*\.)?mydomain\.net/(?!audio) [NC]

(т. е. поставить косую черту за пределы отрицательной части), тогда это работает, но недостатком этого является то, что запросы к mydomain.net без завершающей косой черты не будут перенаправлены.

Кто-нибудь может указать, что я делаю не так?

(Примечание: угловые скобки вокруг домена в приведенном выше бите RewriteRule добавляются StackOverflow.com - их нет в реальном коде!)


Вот правила:

<VirtualHost *:80>
ServerAdmin me@mydomain.net
DocumentRoot "/var/www/mydomain.net/htdocs"
ServerName www.mydomain.net
ServerAlias mydomain.net

RewriteEngine on
RewriteCond {REQUEST_URI} !^/audio
RewriteRule ^(.*)$ http://www.newdomain.net [L,R=301]
RewriteLog logs/mod_rewrite_log
RewriteLogLevel 3

ErrorLog logs/error_log
CustomLog logs/access_log common
</VirtualHost>

Спасибо @mercutio - это имеет смысл, но все равно не работает.

Вот что пишет журнал mod_rewrite, когда я делаю запрос к http://mydomain.net/audio/something.mp3 :

(2) init rewrite engine with requested uri /audio/something.mp3
(3) applying pattern '^(.*)$' to uri '/audio'
(2) rewrite '/audio' -> 'http://www.newdomain.net/'
(2) explicitly forcing redirect with http://www.newdomain.net
(1) escaping http://www.newdomain.net for redirect
(1) redirect to http://www.newdomain.net [REDIRECT/301]

Поскольку REQUEST_URI начинается с, /audioя ожидал, что RewriteRule будет проигнорирован.

21.08.2008 08:42:17
применение шаблона '^ (. *) $' к uri '/ audio' Похоже, он обрабатывает другой шаблон. Или, может быть, логика сейчас только в обратном направлении. Можете ли вы опубликовать свой полный набор правил?
mercutio 21.08.2008 09:33:59
1 ОТВЕТ
РЕШЕНИЕ

HTTP_HOST содержит только имя хоста, а не путь запрошенного URL.

RewriteCond %{REQUEST_URI} !^/audio

Должно быть все, что вам нужно.

Кроме того, вы можете получить отладочную информацию из механизма перезаписи с помощью следующего, что действительно полезно, чтобы увидеть, как ваши условия и правила соответствуют:

RewriteLog /path/to/log/file
RewriteLogLevel 3
48
10.03.2013 17:53:51
Обновление: RewriteCond все еще корректен, но в версиях apache> = 2.4 RewriteLog больше не работает. Вы можете установить Loglevel, специфичный для mod_rewrite, с помощью «LogLevel rewrite: trace3», но затем необходимо просмотреть ErrorLog для вывода.
mightypile 7.12.2017 13:28:38