Apache重写映射有两种可能映射到一个URL?

时间:2018-11-05 20:50:37

标签: apache mod-rewrite

我必须重写如下所示的URL: /foo/bar/xyz//abc/

但是我还必须将稍微不同的URL重写到相同的目的地,如下所示: /foo/xyz//abc/

我已经建立了一个地图,看起来像: xyz/ /abc/

规则如下:

RewriteMap rewrites txt:/path/to/rewritemap.txt
RewriteCond %{REQUEST_URI} ^/foo/.*
RewriteRule ^/foo/(.*) ${rewrites:$1} [R=301,L]
RewriteCond %{REQUEST_URI} ^/foo/bar/.*
RewriteRule ^/foo/bar/(.*) ${rewrites:$1} [R=301,L]

但是,仅当我注释掉第一个(仅foo/bar)时,第二个(foo)才有效。我不知道我在做什么错。

(我唯一想到的解决方案是在地图文件中使匹配URL的数量增加一倍,但这效率不高)

1 个答案:

答案 0 :(得分:0)

可以这么说,Apache将按照复杂性顺序处理重写规则。要使其以您想要的方式处理多种模式,您可以按照从最具体到最不具体的顺序添加它们。

在您的情况下,您只需要在配置中更改两个条件:

RewriteMap rewrites txt:/path/to/rewritemap.txt

# Most specific first
RewriteCond %{REQUEST_URI} ^/foo/bar/.*
RewriteRule ^/foo/bar/(.*) ${rewrites:$1} [R=301,L]

# Least specific (wildcard) last
RewriteCond %{REQUEST_URI} ^/foo/.*
RewriteRule ^/foo/(.*) ${rewrites:$1} [R=301,L]