首页 / 知识

关于apache:mod_rewrite规则,用于重定向除一条特定路径以外的所有请求

2023-04-12 17:18:00

关于apache:mod_rewrite规则,用于重定向除一条特定路径以外的所有请求

mod_rewrite rule to redirect all requests except for one specific path

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

重定向请求用于路径

最新内容

相关内容

热门文章

推荐文章

标签云

猜你喜欢