我正在尝试使用 Apache 2.2 VirtualHost 声明中的 mod_rewrite 将所有对我的域的请求重定向到另一个域。对此有一个例外——我希望不对/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 - 这很有意义,但它似乎仍然不起作用。
这是我向http://mydomain.net/audio/something.mp3发出请求时 mod_rewrite 日志所说的内容:
(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 被忽略。