我正在尝试设置几个简单的规则,这些规则根据路径和查询字符串的位从旧版本的站点重写 URL。
第一次看它看起来像这样:
RewriteEngine on
RewriteMap freeitems txt:/www/www.example.com/etc/freeitems_map.txt
RewriteMap items txt:/www/www.example.com/etc/items_map.txt
RewriteCond %{QUERY_STRING} ^sku=(\d+)$
RewriteRule ^/free_item.php$ https://www.example.com/shop/detail/${freeitems:%1}?
RewriteRule ^/item.php$ https://www.example.com/shop/detail/${items:%1}?
这似乎对/free_item.php
URL 很有效,正确地替换了 的结果RewriteMap
,但是/item.php
URL 只返回了重定向 URL 的第一部分,而忽略了RewriteMap
查找的结果。如果我颠倒了规则的顺序,失败/工作的 URL 就会颠倒。正如我一直理解RewriteRule
的语法一样,如果 URL 路径与模式不匹配,则会跳过规则并继续处理下一个规则。在这种情况下,
我终于设法通过将其分成两个块来使其工作:
RewriteEngine on
RewriteMap freeitems txt:/www/www.example.com/etc/freeitems_map.txt
RewriteMap items txt:/www/www.example.com/etc/items_map.txt
RewriteCond %{QUERY_STRING} ^sku=(\d+)$
RewriteRule ^/free_item.php$ https://www.example.com/shop/detail/${freeitems:%1}?
RewriteCond %{QUERY_STRING} ^sku=(\d+)$
RewriteRule ^/item.php$ https://www.example.com/shop/detail/${items:%1}?
谁能告诉我为什么第一种技术失败了?
编辑:作为测试,我在第二个重定向的 URL 中添加了一个额外的路径元素RewriteRule
。当我请求一个应该匹配第二个规则而不是第一个规则的 URL 时,该路径元素会按预期显示。只是不是RewriteMap
查找的结果。
谢谢!
-本
第一种技术失败的原因是第二个 RewriteRule 上的 RewriteCond %1 反向引用不存在。每个 RewriteRule 都有自己的一组 RewriteCond,并且不与其他 RewriteRule 块共享 RewriteCond。
请参阅:http ://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#InternalRuleset
我还建议添加 [L] 标志,因为看起来每条规则都是独立的。例如:
祝你好运 :)