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

Apache更新后含编码问号的GET请求触发403 Forbidden问题求助

Apache自动更新后编码问号引发403 Forbidden的解决办法

问题背景

Apache夜间自动更新后,网站出现403 Forbidden响应,原因是编码后的问号(%3F)被拦截——而PHP的rawurlencode()会将用户输入中的?编码为%3F,导致包含这类参数的GET请求被拒绝。


是否需要修改所有rawurlencode()相关代码?

不需要全量修改。rawurlencode()本身符合URL编码规范,问题出在Apache更新后的安全拦截规则,优先调整服务器配置而非修改业务代码,能减少不必要的开发成本。


UnsafeAllow3F配置方法

这个选项是Apache允许URL参数中存在编码后问号的核心配置,设置步骤如下:

  1. 打开Apache主配置文件(httpd.conf)或对应站点的虚拟主机配置文件(如/etc/apache2/sites-available/your-site.conf);
  2. 添加或修改以下指令:
    AllowEncodedSlashes On UnsafeAllow3F
    
  3. 重启Apache服务(不同系统命令不同:systemctl restart apache2 或 service httpd restart);
    配置生效后,编码后的%3F就能正常通过Apache的URL解析,原业务代码无需改动。

其他可行解决思路

如果无法修改Apache全局配置,还可以尝试以下方案:

  • ModSecurity规则例外:如果是ModSecurity模块拦截了%3F,可在站点的ModSecurity配置中添加规则,允许特定参数包含编码问号:
    SecRule REQUEST_URI "@contains /test?a=" "phase:1,nolog,allow,t:none"
    
  • POST替代GET:将涉及特殊字符的表单提交方式改为POST,参数不会出现在URL中,自然不会触发拦截,但需要调整表单和后端接收逻辑;
  • 临时字符替换:编码时将%3F替换为自定义占位符,接收端再还原(仅作为应急方案):
    // 编码侧
    $encoded = str_replace('%3F', 'TEMP_QMARK', rawurlencode($test));
    // 接收侧(test.php)
    $decoded = rawurldecode(str_replace('TEMP_QMARK', '%3F', $_GET['a']));
    

代码示例修正

原代码存在语法错误,正确写法应为:

<a href='test?a=<?=rawurlencode($test);?>'>test</a>

配置UnsafeAllow3F后,这段代码无需修改即可正常工作。

内容的提问来源于stack exchange,提问作者C_F

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 04:35:08