含"/ /"或"%20/"的URL无法加载自定义403错误页面求助
解决方案
问题根源
当请求包含空格+尾斜杠的路径(如/ /、/folder/%20/)时,Apache会将其识别为目录请求,但该目录实际不存在,因此直接触发403错误;同时原配置中ErrorDocument使用绝对HTTPS URL,可能导致内部跳转被拦截,无法加载自定义403页面。而无尾斜杠的请求会被Rewrite规则捕获,进入index.php处理,返回预期的404。
步骤1:修复ErrorDocument配置
将绝对URL改为相对路径,确保Apache内部加载自定义403页面,而非外部重定向:
# 替换原有的ErrorDocument行 ErrorDocument 403 /403.php
步骤2:拦截异常路径,强制进入PHP路由
在友好URL规则前添加Rewrite规则,拦截所有包含空格的请求,强制交由index.php处理,避免Apache直接触发403:
RewriteEngine On RewriteBase / # 拦截含空格的异常路径,优先进入PHP路由 RewriteCond %{REQUEST_URI} \s RewriteRule ^(.*)$ index.php?$1 [L,QSA,NC] # The Friendly URLs part RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?$1 [L,QSA,NC]
步骤3:优化PHP路由逻辑
修改index.php,识别纯空格/空内容的异常路径,返回404而非首页:
<?php // 获取原始请求路径,判断是否为纯空格/空的异常路径 $requestUri = trim($_SERVER['REQUEST_URI'], '/'); $URL = explode("/", $_SERVER['QUERY_STRING']); // 拦截仅含空格的异常请求 if ($requestUri !== '' && trim(str_replace('/', '', $requestUri)) === '') { require_once("404.php"); exit; } // 原有路由逻辑 if (trim($URL[0]) == "index" || trim($URL[0]) == ""){ require_once("home.php"); } else if (file_exists(strtolower(trim($URL[0])).".php")) { require_once(strtolower(trim($URL[0])).".php"); } else { require_once("404.php"); } ?>
验证效果
- 访问
example.com/ /或example.com/folder/%20/时,会进入index.php的异常拦截逻辑,返回404页面 - 常规无索引文件夹请求(如
example.com/folder)仍正常触发403并加载自定义403.php - 其他友好URL功能保持正常
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

