Apache httpd重写:仅替换查询字符串参数key的实现问询
正确的mod_rewrite配置方案
你的原有规则存在核心问题:RewriteRule的匹配模式仅作用于请求的URI路径部分(不包含?和查询字符串),所以无法直接在规则里匹配查询字符串,必须通过%{QUERY_STRING}变量单独处理。
针对你的需求,以下是两种场景的配置:
场景1:替换单个foo1参数
适用于查询字符串中仅存在一个foo1参数的情况:
# 捕获包含foo1参数的查询字符串,拆分前缀、参数值、后缀 RewriteCond %{QUERY_STRING} ^(.*)foo1=([^&]+)(.*)$ # 重写友好URL到内部服务,替换foo1为foo2,丢弃原查询字符串 RewriteRule ^friendlyURL(.*)$ /serviceURL$1?%1foo2=%2%3 [L,QSD]
配置说明:
RewriteCond:通过正则捕获查询字符串的三部分:%1是foo1之前的内容,%2是foo1的参数值,%3是foo1之后的内容RewriteRule:匹配以friendlyURL开头的URI,将路径部分保留并拼接到serviceURL后[L]:标记为最后一条规则,处理后停止后续规则[QSD]:丢弃原始查询字符串,避免自动附加到新URL后
场景2:替换所有foo1参数
如果查询字符串中存在多个foo1参数(如foo1=a&foo1=b),需要添加N标志循环处理,直到所有foo1都被替换:
RewriteCond %{QUERY_STRING} (.*)foo1=([^&]+)(.*) RewriteRule ^friendlyURL(.*)$ /serviceURL$1?%1foo2=%2%3 [L,QSD,N]
额外说明:
- 配置中的正则
[^&]+确保只匹配当前foo1参数的值,不会误匹配其他参数的内容 - 该配置不会影响URI路径的其他部分,也不会改变其他参数的顺序
内容的提问来源于stack exchange,提问作者OldApacheGuy
相关产品推荐
相关产品推荐

