如何使用ProxyPass透传查询参数且不进行URL编码
问题原因
问号被编码为%3f是Apache ProxyPass指令的默认行为导致的:该指令会将目标URL中属于路径部分的特殊字符做URL编码,配置中写在目标末尾的?会被识别为路径的一部分,而非查询字符串分隔符,因此被编码传输,导致下游服务无法识别。
解决方案
方案1:全版本兼容的RewriteRule方案
虽然你之前接触的RewriteRule配置可能不符合需求,但按如下配置即可完全丢弃原请求的路径、查询参数,直接转发到你指定的带固定查询参数的目标地址,不会出现编码问题:
<Location "/src"> ProxyErrorOverride Off RewriteEngine On # P标识走代理转发,L标识匹配后停止处理后续规则,直接写死目标地址即可丢弃原请求所有参数 RewriteRule ^ https://example.com/dst/v1234?user=me [P,L] ProxyPassReverse https://example.com/dst/v1234 Header set Cache-Control "max-age=604800, public" </Location>
方案2:高版本Apache原生配置方案
如果你使用的是Apache 2.4.47及以上版本,可以直接用ProxyPass新增的query参数显式指定查询字符串,无需引入Rewrite规则:
<Location "/src"> ProxyErrorOverride Off # 目标路径不带?,查询参数通过query参数单独声明 ProxyPass https://example.com/dst/v1234 query=user=me ProxyPassReverse https://example.com/dst/v1234 Header set Cache-Control "max-age=604800, public" </Location>
两种方案配置完成后重启Apache,转发到应用服务器的请求就会携带原生的?作为查询参数分隔符,不会再出现编码问题。
内容的提问来源于stack exchange,提问作者wheeleruniverse
相关产品推荐
相关产品推荐

