如何在.htaccess中保留URL的&符号?GET参数解析异常问题
问题描述
我在.htaccess中配置了如下规则:
RewriteRule ^(.*)$ index.php?query=$1 [NC,L,QSA]
当访问URL:
domain.com/docs/getting-started/installation-%26-config
期望通过$_GET得到结果:
Array( [query] => docs/getting-started/installation-&-config )
但实际得到:
Array( [query] => docs/getting-started/installation- [-config] => )
请问是否可以在.htaccess中对查询参数进行编码?若不行,该如何解决此问题?
解决方案
原因分析
%26是&的URL编码形式,Apache执行重写规则时会自动将路径中的URL编码解码为原始字符,导致&被当成查询参数的分隔符,进而把-config拆分成了新的空值参数。
可行解决方法
1. 改用REQUEST_URI传递参数
修改.htaccess规则,利用%{REQUEST_URI}变量传递路径,该变量会保留原始编码状态,不会提前解码分隔符:
RewriteRule ^ index.php?query=%{REQUEST_URI} [NC,L,QSA]
如果不需要路径开头的/,可以配合RewriteCond截取:
RewriteCond %{REQUEST_URI} ^/(.*)$ RewriteRule ^ index.php?query=%1 [NC,L,QSA]
2. 在PHP中直接获取原始路径
无需在.htaccess中传递query参数,直接在PHP代码中读取$_SERVER['REQUEST_URI'],再处理掉开头的/即可:
$query = ltrim($_SERVER['REQUEST_URI'], '/'); // $query的值即为docs/getting-started/installation-&-config
3. 服务器级开启编码保留(需权限)
若拥有服务器配置权限,可在虚拟主机或主配置文件中添加AllowEncodedSlashes NoDecode,让Apache不对路径中的编码字符解码,但该设置可能影响其他功能,不推荐作为首选方案。
关于.htaccess中编码的说明
Apache的RewriteRule没有内置URL编码函数,无法直接在.htaccess中对$1进行编码,只能通过上述方法规避自动解码带来的参数拆分问题。
内容的提问来源于stack exchange,提问作者Uchenna Ajah
相关产品推荐
相关产品推荐

