RHEL 8升级后请求URL含特殊字符时意外重定向到根地址问题求解
你遇到的问题是RHEL 8默认集成的*mod_security(Web应用防火墙)*规则拦截了带HTML标签的查询参数,判定为XSS攻击尝试,触发了重定向/拦截逻辑,和你写的PHP代码本身无关。
可行解决方案
1. 排查验证原因(临时操作,生产环境不建议直接关闭防护)
- 如果你用的是Apache服务:
- 编辑配置文件
/etc/httpd/conf.d/mod_security.conf,把SecRuleEngine On改为SecRuleEngine Off - 执行
systemctl restart httpd重启服务后重新测试请求,如果可以正常返回内容,即可确认是mod_security拦截导致的问题
- 编辑配置文件
- 如果你用的是Nginx服务:
- 编辑配置文件
/etc/nginx/modsec/modsec.conf,把SecRuleEngine On改为SecRuleEngine Off - 执行
systemctl restart nginx重启服务后测试验证
- 编辑配置文件
2. 生产环境推荐方案(保留WAF防护,仅添加业务例外规则)
不要全关mod_security防护,仅针对你的业务场景添加自定义放行规则:
- 先查看mod_security审计日志,找到对应请求触发的拦截规则ID:
- Apache日志路径:
/var/log/httpd/modsec_audit.log - Nginx日志路径:
/var/log/nginx/modsec_audit.log
- Apache日志路径:
- 在自定义规则目录下新建规则文件,添加如下内容(以Apache为例,规则ID可自定义,只要不与现有规则冲突即可):
# 放行指定路径下data参数的XSS标签检测规则 SecRule REQUEST_URI "@streq /你的脚本路径.php" "id:10001,phase:2,nolog,pass,ctl:ruleRemoveTargetById=你查到的拦截规则ID;ARGS:data"
- 重启对应的Web服务后即可生效,既保留全局WAF防护,也不影响业务功能。
3. 无服务端配置权限的替代方案
如果没有权限修改服务器配置,建议前端传参时先对参数值做URL编码,服务端PHP可以自动识别解码,不会被WAF拦截:
- 原始参数值
"<title>test</title>"编码后为%22%3Ctitle%3Etest%3C/title%3E%22,拼接后的请求地址为https://example.com?data=%22%3Ctitle%3Etest%3C/title%3E%22即可正常请求
额外提示:如果你的业务不需要输出原始HTML内容,建议输出时用
htmlspecialchars($_GET['data'])处理参数,避免XSS安全风险。
内容的提问来源于stack exchange,提问作者Abdus Sattar Shohag
相关产品推荐
相关产品推荐

