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


39

Я пытаюсь перенаправить все запросы в мой домен в другой домен, используя mod_rewrite в объявлении VirtualHost Apache 2.2. Есть одно исключение: мне бы хотелось, чтобы все запросы к пути /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 без завершающей косой черты не будет перенаправлен.

Может ли кто-нибудь указать, что я делаю неправильно?

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


Вот правила:

<VirtualHost *:80> 
ServerAdmin [email protected] 
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 игнорироваться.

  0

нанесение рисунка to uri '/ audio' Похоже, что он обрабатывает другой шаблон. Или, может быть, логика сейчас просто обратная. Можете ли вы опубликовать свой полный набор правил? 21 авг. 082008-08-21 09:33:59

47

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

RewriteCond %{REQUEST_URI} !^/audio 

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

Кроме того, вы можете получить отладочную информацию от переписывания двигателя со следующим, что действительно полезно, чтобы увидеть, как ваши условия и правила подкрепляются: «(. *)^$»

RewriteLog /path/to/log/file 
RewriteLogLevel 3 
  0

Вы должны были отредактировать свой ответ, вместо добавления другого. 05 июн. 122012-06-05 00:46:00

  0

Обновление: RewriteCond все еще верна, но в версиях apache> = 2.4 RewriteLog больше не работает. Вы можете установить Loglevel, специфичный для mod_rewrite, с помощью «LogLevel rewrite: trace3», но затем необходимо просмотреть отчет ErrorLog для вывода. 07 дек. 172017-12-07 13:28:38