mod_rewrite规则重定向除一个特定路径以外的所有请求


39

我试图在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没有结尾斜杠将不会被重定向。

任何人都可以指出我做错了什么?

(注:各地在上述正在StackOverflow.com添加的重写规则位域中的尖括号 - 它们不存在在实际的代码)


这里有规则:

<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开始我预计重写规则被忽略。

  0

应用模式to uri'/ audio'听起来像是在处理不同的模式。或者,现在的逻辑倒退了。你能发布你的全套规则吗? 21 8月. 082008-08-21 09:33:59

47

HTTP_HOST只包含主机名,而不包含所请求的URL的路径。

RewriteCond %{REQUEST_URI} !^/audio 

应该是你所需要的。

此外,你可以从下面的重写引擎,这是真正有用的,看看你的条件和规则被匹配得到调试信息:“(。*)^ $”

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

你应该编辑你的答案,而不是添加另一个答案。 05 6月. 122012-06-05 00:46:00

  0

更新:RewriteCond仍然正确,但在apache> = 2.4的版本中,RewriteLog不再有效。您可以使用'LogLevel rewrite:trace3'将Loglevel设置为特定于mod_rewrite,但需要注意ErrorLog输出。 07 12月. 172017-12-07 13:28:38