mod_rewrite规则redirect除一个特定path以外的所有请求

我试图在Apache 2.2 VirtualHost声明中使用mod_rewrite将所有请求redirect到我的域到另一个域。 有一个例外 – 我想所有的请求/audiopath被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