mod_rewrite规则,用于重定向除一个特定路径以外的所有请求
时间:2020-03-05 18:41:26 来源:igfitidea点击:
我正在尝试使用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添加的-它们在实际代码中不存在!)
规则如下:
<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-这很有意义,但它似乎仍然无法正常工作。
这是我向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被忽略。
解决方案
回答
HTTP_HOST仅包含主机名,而不包含所请求URL的路径。
RewriteCond %{REQUEST_URI} !^/audio
应该是我们所需要的。
此外,我们可以使用以下内容从重写引擎中获取调试信息,这对于查看条件和规则如何匹配非常有用:
RewriteLog /path/to/log/file RewriteLogLevel 3