我正在尝试使用Apache 2.2 VirtualHost声明中的mod_rewrite将所有请求重定向到我的域到另一个域。有一个例外-我希望对/audio路径的所有请求都不会被重定向。
我已经写了一个RewriteCond和RewriteRule来做到这一点,但这并不完全正确,我也不知道为什么。正则表达式包含对字符串" / audio"的否定超前查询,但是由于某种原因,这不匹配。这是定义:
1 2 3
| RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*\\.)?mydomain\\.net(?!/audio) [NC]
RewriteRule ^(.*)$ http://www.newdomain.net [L,R=301] |
如果我将RewriteCond更改为:
1
| RewriteCond %{HTTP_HOST} ^(.*\\.)?mydomain\\.net/(?!audio) [NC] |
(即,将正斜杠放在负前瞻部分的外部)然后可以工作,但是这样做的缺点是,不带斜杠的对mydomain.net的请求将不会被重定向。
有人能指出我在做什么错吗?
(注意:以上RewriteRule位中域的尖括号由StackOverflow.com添加-在实际代码中不存在!)
以下是规则:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <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日志所说的内容:
1 2 3 4 5 6
| (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的路径。
1
| RewriteCond %{REQUEST_URI} !^/audio |
应该是您所需要的。
此外,您可以使用以下内容从重写引擎获取调试信息,这对于查看您的条件和规则如何匹配非常有用:
1 2
| RewriteLog /path/to/log/file
RewriteLogLevel 3 |