You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 20:55:14