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

URL中的%20引发ERROR 403 FORBIDDEN错误的解决求助

解决方案:Drupal 6搜索含空格URL触发403 Forbidden

1. 修改Drupal搜索URL的编码逻辑

直接让Drupal生成二次编码的空格(%2520),避免触发Apache的拦截:

  • 找到站点根目录下modules/search/search.module文件,定位到search_box_form_submit函数(Drupal 6.20版本大概在300行左右)
  • 原代码示例:
    function search_box_form_submit($form, &$form_state) {
      $keys = $form_state['values']['search_block_form'];
      if ($keys != '') {
        drupal_goto('search/node/' . $keys);
      }
    }
    
  • 修改为:
    function search_box_form_submit($form, &$form_state) {
      $keys = $form_state['values']['search_block_form'];
      if ($keys != '') {
        // 对搜索关键词做两次URL编码,将空格转为%2520
        $encoded_keys = rawurlencode(rawurlencode($keys));
        drupal_goto('search/node/' . $encoded_keys);
      }
    }
    
  • 若站点内有手动添加的搜索链接,也需要对关键词做二次编码后再拼接URL。

2. 通过.htaccess重定向绕过拦截

如果不想修改Drupal核心代码,可在站点根目录的.htaccess文件末尾添加以下重写规则,自动将含%20的搜索URL转为%2520版本:

RewriteEngine On
# 循环替换搜索路径中的%20为%2520,直到所有空格完成二次编码
RewriteRule ^(search/node/.+?)%20(.+)$ $1%2520$2 [N,R=301,L]

该规则会匹配/search/node/开头的URL,逐步替换其中的%20为%2520并301重定向,浏览器会自动加载可正常访问的地址。

3. 要求主机商调整安全规则

由于是共享主机无法直接修改Apache配置,可联系主机商明确提出:

  • 检查mod_security是否启用了针对路径含空格(%20)的拦截规则
  • 将站点/search/node/路径加入mod_security白名单,禁止拦截该路径下的请求
  • 确认Apache的AllowEncodedSlashes等相关参数是否被修改,导致编码后的空格被拦截

问题原因说明

Apache更新后,其内置安全规则或mod_security规则集可能将路径中的%20(URL编码后的空格)判定为潜在恶意请求(如路径遍历攻击特征),触发403拦截。而%2520是对空格做了两次URL编码,Apache解码一次后得到%20,传递给Drupal后再解码为正常空格,因此能绕过拦截正常工作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 13:44:53