Apache mod_rewrite 规则顺序混乱

Apache mod_rewrite 规则顺序混乱

我正在尝试设置一些简单的规则,根据路径和查询字符串的位重写网站旧版本的 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.phpURL 很有效,可以正确地替换来自 的结果RewriteMap,但/item.phpURL 只返回重定向 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

谢谢!

-本

答案1

第一种技术失败的原因是,第二个 RewriteRule 上的 RewriteCond %1 反向引用不存在。每个 RewriteRule 都有自己的一组 RewriteCond,并且不与其他 RewriteRule 块共享 RewriteCond。

看:http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#InternalRuleset

我还建议添加 [L] 标志,因为看起来每个规则都是独立的。例如:

RewriteRule ^/free_item.php$ https://www.example.com/shop/detail/${freeitems:%1}? [L]

RewriteRule ^/item.php$ https://www.example.com/shop/detail/${items:%1}? [L]

祝你好运 :)

相关内容