我必须重写如下所示的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的数量增加一倍,但这效率不高)
答案 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]