【问题标题】:Apache RewriteMap with wildcard condition具有通配符条件的 Apache RewriteMap
【发布时间】:2016-09-22 19:55:21
【问题描述】:

我正在使用带有文本文件的 apache RewriteMap 将一些旧 url 映射到新 url,在我的文件 (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 部分,我尝试了一些组合都没有成功,这可能吗?

【问题讨论】:

    标签: apache mod-rewrite url-rewriting rewritemap


    【解决方案1】:

    您需要在 RewriteRule 指令本身中将 /cgi-bin/scriptname 设置为可选模式。而且,这里完全不需要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]
    

    【讨论】:

    • 嗨@hjpotter92,我认为,RewriteCond 是处理这种情况所必需的,即查找在不匹配时返回一个空字符串。否则,即使在不匹配的情况下,您的第一个 sn-p 中的 RewriteRule 也会被触发(并重定向到文档根目录,而不是正确的 404)。您的第二个 sn-p 可能无法按此顺序工作,因为第一个规则的模式也匹配 cgi-bin/scriptname
    • @martin 地图会自己处理。
    • 根据我的经验,RewriteRule 并不关心地图查找是否成功。在 Apache/2.4.10 (Debian) 上,以下配置总是触发第一次重写:RewriteRule (.*) http://example.com/${map:nonexistant_key} [R=301,L] \n RewriteRule (.*) http://fallback.com [R=301,L]
    • @martin 因为你重写的路径定义了正确的 url,所以它总是会触发R=301。而在我上面的例子中,我只是使用相对重写;如果地图没有匹配的条目,则会被忽略。
    • @hjpotter92 奇怪 - 您的预期行为(忽略空替换)是否记录在某处?因为这不是这里发生的事情:RewriteRule (.*) ${manual_map:nonexistant_key} [R=301,L] 导致日志:'map lookup FAILED: map=manual_map[dbm] key=nonexistant_key \n rewrite '/foo' -> '' \n 使用myservername.com 显式强制重定向` -> 重定向到文档根目录。
    猜你喜欢
    • 2013-08-16
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多