2

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

4

1 回答 1

1

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

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

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

但是,如果您希望重写的 URL/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]
于 2016-09-22T20:02:44.993 回答