.htaccess重写规则如何正确支持含&字符的URL参数?
解决.htaccess RewriteRule匹配含&字符的term问题
问题核心在于URL中的&是保留字符,浏览器会自动将它识别为GET参数的分隔符,而非路径的一部分。比如你输入domain.com/index/2/jonathan&doe,实际服务器收到的请求路径是index/2/jonathan,同时多了一个无值的doe参数,根本到不了你的RewriteRule匹配逻辑里——这就是为什么你把&加到正则里也没用的原因。
正确解决分两步:
前端对特殊字符编码
生成URL时,必须把term中的&(以及其他URL特殊字符)用encodeURIComponent()编码成%26。比如jonathan&doe要转成jonathan%26doe,最终URL为domain.com/index/2/jonathan%26doe。这样浏览器才会把%26当作路径的一部分完整传递给服务器。简化RewriteRule的正则匹配
不用手动罗列所有允许的字符,直接用[^/]+匹配路径中除分隔符/之外的所有内容,这样不管term里有什么编码后的字符都能被匹配到。修改后的规则如下:
RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^index/([0-9a-zA-Z_-]+)/([^/]+) index.php?id=$1&term=$2 [NC,L]
这样处理后,服务器收到index/2/jonathan%26doe的请求时,会正确匹配规则并内部重定向到index.php?id=2&term=jonathan&doe,PHP的$_GET['term']就能拿到完整的jonathan&doe值。
补充:不要尝试在服务器端直接处理未编码的&,因为浏览器已经提前拆分了参数,服务器根本接收不到路径里的&,前端编码是必须的前提。
内容的提问来源于stack exchange,提问作者MoodyA1
相关产品推荐
相关产品推荐

