结合RedirectMatch和RewriteRule

时间:2015-07-07 05:13:31

标签: apache mod-rewrite

我想将重定向与重写相结合。 重写应匹配完整路径,但重定向应仅匹配子路径。

网址:http://localhost/mypath/google

预期:重定向到http://www.google.com/

实际:重写为http://stackoverflow.com

RewriteEngine On
RedirectMatch ^/mypath/google/(.*) http://www.google.com/
RewriteRule   ^/mypath/(.*)$  http://stackoverflow.com [L,P]

显然RewriteRule始终匹配。是否可以更改规则,以便首先检查RedirectMatch规则?

1 个答案:

答案 0 :(得分:1)

在处理请求期间,Apache以特定顺序调用其不同的模块 - 因此您不能假设您按照特定顺序在配置文件中编写的所有指令也将按此顺序“执行”。

由于RedirectMatchRewriteRule来自不同的模块,我认为就是这种情况 - 首先处理您的RewriteRule,然后重写以/mypath/开头的所有内容,等等你的RedirectMatch没有机会再乘坐火车......

因此,最简单的解决方案是使用RewriteRules处理两个重定向,首先处理更具体的路径,然后使用已有的第二个规则捕获其余路径。

RewriteEngine On
RewriteRule ^/mypath/google/(.*) http://www.google.com/ [R]
RewriteRule ^/mypath/(.*)$  http://stackoverflow.com [L,P]