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
相关产品推荐
相关产品推荐

