当前位置:  开发笔记 > 运维 > 正文

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

如何解决《mod_rewrite规则重定向除一个特定路径之外的所有请求》经验,为你挑选了1个好方法。

我正在尝试使用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请求.

谁能指出我做错了什么?

(注意:上面的RewriteRule位中的域周围的尖括号是由StackOverflow.com添加的 - 它们在实际代码中不存在!)


以下是规则:


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


谢谢@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.



1> mercutio..:

HTTP_HOST仅包含主机名,而不是所请求URL的路径.

RewriteCond %{REQUEST_URI} !^/audio

应该是你所需要的一切.

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

RewriteLog /path/to/log/file
RewriteLogLevel 3

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有