我试图在Apache 2.2 VirtualHost声明中使用mod_rewrite将所有请求重定向到我的域到另一个域。有一个例外 - 我希望所有请求/audio
路径而不是被重定向。mod_rewrite规则重定向除一个特定路径以外的所有请求
我已经写了一个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
开始我预计重写规则被忽略。
应用模式to uri'/ audio'听起来像是在处理不同的模式。或者,现在的逻辑倒退了。你能发布你的全套规则吗? – mercutio 2008-08-21 09:33:59