Apache2 ModRewrite规则:移除查询参数末尾冒号的问题
修复URL中name参数末尾冒号的重定向规则
原规则出现路径丢失的问题,核心原因是用$1构建目标路径时,受Apache RewriteRule的匹配上下文影响,无法准确保留完整请求路径。以下是修正后的规则,可同时适配顶级域名和任意子目录:
# 匹配name参数末尾带冒号的查询字符串 RewriteCond %{QUERY_STRING} ^(.*)(?:&|^)name=([^&]+):(.*)$ # 保留原路径,移除name参数末尾的冒号 RewriteRule ^ /%{REQUEST_URI}?%1name=%2%3 [L,R=302,NE]
关键改进说明:
- 正则精准匹配:
(?:&|^)确保定位name参数的合法起始位置(要么是查询串开头,要么前接&);[^&]+精准捕获name的参数值,避免过度匹配其他内容。 - 完整路径保留:用
%{REQUEST_URI}替代$1,直接获取请求的完整路径(比如/dir/),彻底解决重定向到顶级目录的问题。 - 避免转义问题:添加
NE(No Escape)标记,防止Apache对查询参数中的特殊字符进行不必要转义,保证参数格式正确。
效果验证:
原URL:https://example.com/dir/?foo=bar&name=hello:&baz=bat#123
重定向后:https://example.com/dir/?foo=bar&name=hello&baz=bat#123
该规则对顶级域名(如https://example.com/?name=test:)和任意子目录场景均能正常生效。
内容的提问来源于stack exchange,提问作者mgiuffrida
相关产品推荐
相关产品推荐

