我正在使用带有文本文件的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部分,我都尝试了一些没有成功的组合,这可能吗?
答案 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]