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

子目录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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 03:50:28