【问题标题】:mod_rewrite rule to redirect all requests except for one specific pathmod_rewrite 规则重定向除一个特定路径之外的所有请求
【发布时间】:2010-09-06 09:03:42
【问题描述】:

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

我已经编写了 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 请求将不会被重定向。

谁能指出我做错了什么?

(注意:上面 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 被忽略。

【问题讨论】:

  • 将模式 '^(.*)$' 应用于 uri '/audio' 听起来它正在处理不同的模式。或者也许现在逻辑只是倒退了。你能发布你的全套规则吗?

标签: apache mod-rewrite


【解决方案1】:

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

RewriteCond %{REQUEST_URI} !^/audio

应该是你所需要的。

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

RewriteLog /path/to/log/file
RewriteLogLevel 3

【讨论】:

  • 更新:RewriteCond 仍然正确,但在 apache >= 2.4 版本中,RewriteLog 不再有效。您可以使用 'LogLevel rewrite:trace3' 设置特定于 mod_rewrite 的 Loglevel,但随后需要查看 ErrorLog 的输出。
猜你喜欢
  • 2016-10-17
  • 2015-04-19
  • 1970-01-01
  • 2019-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-28
相关资源
最近更新 更多