Правило mod_rewrite для перенаправления всех запросов, кроме одного конкретного пути
-
09-06-2019 - |
Вопрос
Я пытаюсь перенаправить все запросы к моему домену на другой домен, используя 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 будет проигнорирован.
Решение
HTTP_HOST содержит только имя хоста, а не путь к запрошенному URL-адресу.
RewriteCond %{REQUEST_URI} !^/audio
Должно быть все, что вам нужно.
Кроме того, вы можете получить отладочную информацию от механизма перезаписи с помощью следующего, что действительно полезно для проверки соответствия ваших условий и правил:
RewriteLog /path/to/log/file
RewriteLogLevel 3