Apache mod_重写规则重定向除一个特定路径之外的所有请求

Apache mod_重写规则重定向除一个特定路径之外的所有请求,apache,mod-rewrite,Apache,Mod Rewrite,我正在尝试使用Apache2.2VirtualHost声明中的mod_rewrite将所有到我域的请求重定向到另一个域。有一个例外——我希望所有对/audio路径的请求都不要被重定向 我已经写了一个RewriteCond和RewriteRule来做这件事,但它并不完全正确,我不知道为什么。正则表达式包含字符串“/audio”的负前瞻,但由于某些原因,这不匹配。定义如下: RewriteEngine on RewriteCond %{HTTP_HOST} ^(.*\.)?mydomain\.net

我正在尝试使用Apache2.2VirtualHost声明中的mod_rewrite将所有到我域的请求重定向到另一个域。有一个例外——我希望所有对
/audio
路径的请求都不要被重定向

我已经写了一个RewriteCond和RewriteRule来做这件事,但它并不完全正确,我不知道为什么。正则表达式包含字符串“/audio”的负前瞻,但由于某些原因,这不匹配。定义如下:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*\.)?mydomain\.net(?!/audio) [NC]
RewriteRule ^(.*)$ http://www.newdomain.net [L,R=301]
如果我将“重写条件”更改为:

RewriteCond %{HTTP_HOST} ^(.*\.)?mydomain\.net/(?!audio) [NC]
(也就是说,将正斜杠放在负向前看部分之外)然后它就可以工作了,但这样做的缺点是,不带尾随斜杠的mydomain.net请求将不会被重定向

有人能指出我做错了什么吗

(注意:上面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>

由于请求URI以
/audio
开头,我希望重写规则被忽略。

HTTP主机只包含主机名,而不包含请求URL的路径

RewriteCond %{REQUEST_URI} !^/audio
这应该是你所需要的

此外,您可以通过以下内容从重写引擎获取调试信息,这对于查看您的条件和规则如何匹配非常有用:

RewriteLog /path/to/log/file
RewriteLogLevel 3

将模式“^(.*)$”应用于uri“/audio”听起来像是在处理不同的模式。或者也许现在的逻辑是倒退的。你能发布你的全部规则吗?更新:RewriteCond仍然正确,但是在apache>=2.4的版本中,RewriteLog不再工作。您可以使用“Loglevel rewrite:trace3”设置特定于mod_rewrite的Loglevel,但需要查看错误日志的输出。
RewriteLog /path/to/log/file
RewriteLogLevel 3