【发布时间】:2013-07-21 00:46:52
【问题描述】:
当我有多个 RewriteCond 链接在一起时,只有最后一个 RewriteCond 的捕获组可以用%0-%9 引用。
在下面的问题中,url的查询字符串中的参数可以是任意顺序。要将它们解析为花哨的 url,我需要单独匹配查询字符串中的每个参数:
RewriteCond %{QUERY_STRING} param1=([^&]+)
RewriteCond %{QUERY_STRING} param2=([^&]+)
RewriteCond %{QUERY_STRING} param3=([^&]+)
RewriteRule ^foo$ bar/%1/%2/%3/ [R]
就像我指出的那样……这行不通。为了解决这个问题,我可以在下一个 RewriteCond 中引用前一个 RewriteCond 的捕获组,并将每个参数“传播”到实际的 RewriteRule:
RewriteCond %{QUERY_STRING} param1=([^&]+)
RewriteCond %1&%{QUERY_STRING} ^([^&]*)&.*param2=([^&]+)
RewriteCond %1&%2&%{QUERY_STRING} ^([^&]*)&([^&]*)&.*param3=([^&]+)
RewriteRule ^foo$ bar/%1/%2/%3/ [R]
这应该可以,但是对于每个附加参数,它会变得更加混乱。另一种解决方案可能是解析一个参数并在每个参数之后重定向客户端(导致冗长的重定向链,我想避免这种情况)。
是否有更简洁的方式来访问 RewriteRule 中所有 RewriteCond 的捕获组(例如,是否可以命名它们或将它们分配给一个变量,以便我可以在其他地方引用它们?)
【问题讨论】:
-
+1 提出了一个很好的问题。我也遇到过这个问题,很想知道答案
-
mod_rewrite 文档说 RewriteCond 反向引用仅在当前条件集中保留 last match RewriteCond,所以,是的,您的第二个答案可能是这条路线中的唯一答案.考虑到它的复杂性,您是否考虑过在
foo上设置一个脚本来解析 GET) 或 POST) 并重定向到适当的bar?
标签: .htaccess mod-rewrite