【问题标题】:mod_rewrite send everything not matched to a rewritemapmod_rewrite 将所有不匹配的内容发送到 rewritemap
【发布时间】:2009-12-15 20:20:42
【问题描述】:

我有一个以常规内容开头的 htaccess 文件:

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

然后进行了一些重写,例如:

RewriteRule ^protect/?$ /Legal/Your-Financial-Protection.aspx   [NC, L, R=301]

然后以重写映射结束:

RewriteMap map txt:rewritemaps/map.txt  [NC]
RewriteRule ^(.+)$  ${map:$1}   [R=301]

rewritemap 包含我们所有的旧 url - 我们当前站点上的页面和将被重定向到新站点上的等效页面的短 url(大约有 4k,所以我真的需要使用地图):

Inspiration.aspx /Inspiration.aspx
Destinations/Africa/Countries/Gabon.aspx /Destinations/Africa/Gabon.aspx
indonesia /Destinations/Southeast-Asia/Indonesia.aspx

问题是,启用 rewritemap(即未注释掉)后,我所有的 url(甚至那些不匹配的)都重定向到 / - 包括样式表、js、图像等。

我所追求的是与地图中的模式匹配以重定向到替换的 uris 以及要通过的所有其他内容(即保持不变)。

我尝试在地图上设置默认值 1 美元:

RewriteRule ^(.+)$  ${map:$1|$1}    [R=301]

但这只会导致重定向循环。我想我也可以跳过所有 .css、.js、.jpg 等的重写,但宁愿不必维护使用的文件扩展名列表。

仅供参考,我使用的是 HeliconTech 的 ISAPIRewrite(因为我使用的是 IIS 6),尽管它声称可以按照 apache 处理重写映射,而且我们过去从未遇到过问题。

任何帮助将不胜感激!

谢谢,亚当

【问题讨论】:

    标签: .htaccess mod-rewrite rewritemap


    【解决方案1】:

    只需将实际不同的对放在地图中即可。否则,您将重定向到相同的值并获得无限递归。

    如果要仅在找到匹配项时重定向,请尝试以下操作:

    RewriteCond ${map:$1} ^/.+
    RewriteRule ^(.+)$ %0 [R=301]
    

    【讨论】:

    • 谢谢 - 这解决了循环问题,但它仍然不匹配地图中的任何内容
    【解决方案2】:

    这行是问题所在:

    RewriteMap map txt:rewritemaps/map.txt  [NC]
    

    您不能在 .htaccess 文件中定义 RewriteMap。 (See RewriteMap docs) 您必须在服务器或虚拟主机上下文中定义映射,然后才能在您的 .htaccess 文件中引用它。如果您将日志级别调高到足够高,您会看到一条警告,提示您的地图未加载。

    【讨论】:

      【解决方案3】:

      Gumbo 的解决方案很棒,只是它似乎无法处理带有空格的 URL。 http://www.webmasterworld.com/apache/3830228.htm 提供有关如何处理空间的见解, 像这样将两者结合起来:

        RewriteCond ${moved:${escape:$1}} ^/.+
        RewriteRule ^(.+)$ %0 [R=301]
      

      不起作用。该死的我讨厌 mod_rewrite

        IPADDR - - [07/Jan/2010:01:44:58 --0500] [example.org/sid#842a5a8][rid#100e0a18/initial] (2) init rewrite engine with requested uri /press/Partners With City.pdf
        IPADDR - - [07/Jan/2010:01:44:58 --0500] [example.org/sid#842a5a8][rid#100e0a18/initial] (3) applying pattern '^(.+)$' to uri '/press/Partners With City.pdf'
        IPADDR - - [07/Jan/2010:01:44:58 --0500] [example.org/sid#842a5a8][rid#100e0a18/initial] (5) map lookup OK: map=escape key=/press/Partners With City.pdf -> val=/press/Partners%20With%20City.pdf
        IPADDR - - [07/Jan/2010:01:44:58 --0500] [example.org/sid#842a5a8][rid#100e0a18/initial] (6) cache lookup FAILED, forcing new map lookup
        IPADDR - - [07/Jan/2010:01:44:58 --0500] [example.org/sid#842a5a8][rid#100e0a18/initial] (5) map lookup FAILED: map=moved[txt] key=/press/Partners%20With%20City.pdf
        IPADDR - - [07/Jan/2010:01:44:58 --0500] [example.org/sid#842a5a8][rid#100e0a18/initial] (4) RewriteCond: input='' pattern='^/.+' => not-matched
      

      【讨论】:

        【解决方案4】:

        adam,Gumbo 的规则包括键中的前导斜杠, 并且您发布的地图版本缺少它们。

        RewriteLogLevel 9 非常适合发现此类问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-11
          • 2018-09-30
          • 1970-01-01
          • 2021-03-17
          • 1970-01-01
          • 1970-01-01
          • 2013-09-08
          • 1970-01-01
          相关资源
          最近更新 更多