使用RewriteCond匹配3个URL查询参数实现重写失败的问题
URL重写问题:三查询参数转路径变量失效
我需要把带三个查询参数的URL:https://address.com/bin/servlet?firstKey=firstValue&secondKey=secondValue&thirdKey=thirdValue
重写为路径变量形式:https://address.com/content/firstValue/secondValue/thirdValue
仅处理两个参数时,以下配置可以正常工作:
RewriteCond %{QUERY_STRING} &?firstKey=([^&]+)&?secondKey=([^&]+) [NC] RewriteRule ^/bin/servlet /content/%1/%2 [QSD,PT]
但添加第三个参数后,配置就失效了,当前配置如下:
RewriteCond %{QUERY_STRING} &?firstKey=([^&]+)&?secondKey=([^&]+)&?thirdKey=([^&]+) [NC] RewriteRule ^/bin/servlet /content/%1/%2/%3 [QSD,PT]
问题原因与修复方案
核心问题:转义字符错误
你配置里的&是HTML转义后的字符,而Apache的Rewrite规则中需要直接使用&作为查询参数的分隔符,用&会被当成字面量匹配,自然无法匹配到实际URL中的&分隔符。
修复后的配置(参数顺序固定)
如果三个参数的顺序是固定的(必须是firstKey→secondKey→thirdKey),可以用以下严谨的配置:
RewriteCond %{QUERY_STRING} ^firstKey=([^&]+)&secondKey=([^&]+)&thirdKey=([^&]+)$ [NC] RewriteRule ^/bin/servlet /content/%1/%2/%3 [QSD,PT]
^和$锚定整个查询字符串,避免部分匹配导致的异常- 直接使用
&作为分隔符,不再用转义后的&
灵活配置(允许参数顺序任意)
如果三个参数的顺序不固定,或者URL中可能存在其他额外参数,可以用多条件匹配的方式:
RewriteCond %{QUERY_STRING} (^|&)firstKey=([^&]+)(&|$) [NC] RewriteCond %{QUERY_STRING} (^|&)secondKey=([^&]+)(&|$) [NC] RewriteCond %{QUERY_STRING} (^|&)thirdKey=([^&]+)(&|$) [NC] RewriteRule ^/bin/servlet /content/%2/%4/%6 [QSD,PT]
- 每个
RewriteCond单独匹配一个参数,确保三个参数都存在 - 捕获组
%2对应第一个参数的值,%4对应第二个,%6对应第三个(每个条件有两个捕获组,所以跳着取)
内容的提问来源于stack exchange,提问作者John Kangari
相关产品推荐
相关产品推荐

