具有通配符条件的Apache RewriteMap

时间:2016-09-22 19:55:21

标签: apache mod-rewrite url-rewriting rewritemap

我正在使用带有文本文件的apache RewriteMap将一些旧网址映射到新网址,在我的文件中(red.map)我有

/old-awful-url.html   /new-lovely-shiny-url.html

然后在我的apache配置中,我有: -

RewriteEngine On
RewriteMap      migration       txt:/home/red.map
RewriteCond     ${migration:$1} /.+
RewriteRule     ^(/.*)  ${migration:$1} [L,R=301]

这很好但现在我想在条件中添加一个通配符,以匹配一些具有相同结尾但前面有/cgi-bin/scriptname的旧网址,例如我也想匹配/cgi-bin/scriptname/old-awful-url.html

我尝试更改为RewriteCond: -

RewriteCond     ^.*${migration:$1} /.+

认为这会匹配文件中url前面的任何内容,无论是否有cgi部分,我都尝试了一些没有成功的组合,这可能吗?

1 个答案:

答案 0 :(得分:1)

您需要在/cgi-bin/scriptname指令中将RewriteRule设置为可选模式。而且,这里完全没有RewriteCond指令。

RewriteEngine On
RewriteMap migration txt:/home/red.map

RewriteRule ^(?:/cgi-bin/scriptname)?(/.*) ${migration:$1} [L,R=301]

但是,如果您希望重写的网址再次包含/cgi-bin/scriptname部分,则会失败。为此,您需要将规则分为两个(或更多?):

RewriteEngine On
RewriteMap migration txt:/home/red.map

RewriteCond ${migration:$1} .
RewriteRule ^(/.*) ${migration:$1} [L,R=301]

RewriteCond ${migration:$2} .
RewriteRule ^/(cgi-bin/scriptname)(/.*) /$1${migration:$2} [L,R=301]