mod_rewrite规则redirect除一个特定path以外的所有请求
我试图在Apache 2.2 VirtualHost声明中使用mod_rewrite将所有请求redirect到我的域到另一个域。 有一个例外 – 我想所有的请求/audio
path不被redirect。
我已经写了一个RewriteCond和RewriteRule来做到这一点,但它不是很正确,我不明白为什么。 正则expression式包含对string“/ 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的请求将不会被redirect。
任何人都可以指出我做错了什么?
(注意:上面的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会被忽略。
HTTP_HOST只包含主机名,而不包含URL请求的path。
RewriteCond %{REQUEST_URI} !^/audio
应该是所有你需要的。
此外,您可以从重写引擎中获得debugging信息,这对于查看您的条件和规则如何匹配非常有用:
RewriteLog /path/to/log/file RewriteLogLevel 3