子目录mod_rewrite环境下调用404页面出现乱码问题求助
解决子目录下404返回乱码及Rewrite规则问题
先修正.htaccess的低级错误
你写的ReweiteCond是拼写错误,正确写法是RewriteCond——这个错误会导致整个Rewrite规则失效,所有请求不管是否真实存在都会被转至index.php,这大概率是后续问题的诱因。修正后的完整代码:
# 启用mod_rewrite RewriteEngine On # 仅当请求的不是真实目录、文件或符号链接时才执行重写 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-l # 重写所有请求到index.php并传递URL参数 RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
解决404返回乱码的核心方案
1. 确保文件路径正确
因为是子目录环境,include("404.php")可能因相对路径问题找不到正确文件,导致包含无效内容(甚至二进制文件)引发乱码。改用绝对路径更稳妥:
include(__DIR__ . "/404.php");
__DIR__会获取当前PHP文件所在目录,彻底避免路径混乱。
2. 严格控制响应头输出顺序
编码头和状态码必须在任何内容输出前设置,且顺序至关重要——先指定编码,再设置404状态:
// 先设置编码响应头,确保浏览器用UTF-8解析 header('Content-Type: text/html; charset=UTF-8'); // 设置404状态码 http_response_code(404); // 包含404页面 include(__DIR__ . "/404.php"); die();
如果404.php内也有header设置,要确保它没有在任何HTML输出后调用,否则会因输出缓冲导致编码头失效。
3. 排查服务器压缩冲突
若服务器开启了gzip压缩,但PHP输出未适配,可能导致压缩后的内容被错误解析为乱码。可临时禁用压缩测试:
ini_set('zlib.output_compression', 'Off'); header('Content-Encoding: none');
测试后若乱码消失,再调整服务器压缩配置(如Apache的mod_deflate),确保与PHP编码输出兼容。
4. 检查文件本身的编码
用编辑器打开404.php,确认它是UTF-8无BOM格式——如果文件本身是GBK或带BOM的UTF-8,哪怕设置了响应头,浏览器也会解析出错。
最后验证逻辑
修复Rewrite规则后,先测试真实存在的文件/目录是否能正常访问,再测试不存在的URL是否会进入index.php的404逻辑,确保整个流程符合预期。
内容的提问来源于stack exchange,提问作者Mostafa
相关产品推荐
相关产品推荐

