Apache服务器含特殊字符路径下PHP脚本404问题求助
Apache路径含重音/空格时PHP脚本返回404(HTML正常)的问题诊断与修复
问题现象
- 服务器存在含空格或é、á、ö等重音字符的文件路径,同时满足以下两个条件时,返回自定义的“File not found.”提示:
- 请求路径包含空格/重音字符
- 请求的是PHP脚本
- 无特殊字符的路径下,PHP脚本可正常运行;含特殊字符的路径下,HTML文件能正常加载
测试案例日志
192.168.178.11 - MM [12/Oct/2024:21:49:47 +0200] "GET /test/urlenc_w_php/e/index.php HTTP/1.1" 200 360 192.168.178.11 - MM [12/Oct/2024:21:49:51 +0200] "GET /test/urlenc_w_php/e/index.html HTTP/1.1" 304 - 192.168.178.11 - MM [12/Oct/2024:21:49:54 +0200] "GET /test/urlenc_w_php/%C3%A9/index.php HTTP/1.1" 404 16 192.168.178.11 - MM [12/Oct/2024:21:49:56 +0200] "GET /test/urlenc_w_php/%C3%A9/index.html HTTP/1.1" 304 -
注:%C3%A9是“é”的URL编码形式,日志明确显示含“é”路径的PHP请求返回404,HTML请求正常。
补充信息
- 此处的“File not found.”提示与请求真实不存在文件时的Apache默认提示(“Not Found”“The requested URL was not found on this server.”)不同,说明错误由PHP相关进程生成。
测试文件代码
index.php
<?php echo <<<END <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <title>Title</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"/> </head> <body> <a href=index.php>PHP</a> <a href=index.html>HTML</a> </body> </html> END; ?>
HTML文件内容与PHP脚本输出完全一致,浏览器直接输入路径或点击页面内链接结果相同。
诊断与修复方案
诊断核心
这是URL编码与文件系统编码不匹配导致的问题:Apache能正确解析特殊字符路径找到HTML文件,但PHP-FPM(或mod_php)在接收路径时编码转换错误,无法匹配实际文件。
修复步骤
确认系统默认编码
执行命令查看系统locale:locale确保输出包含
UTF-8(如LANG=en_US.UTF-8),若未配置需先将系统locale设置为UTF-8。配置Apache编码规则
在Apache主配置文件(httpd.conf)或虚拟主机配置块中添加以下指令,确保URL解码使用UTF-8:AddDefaultCharset UTF-8针对目标目录,可补充:
<Directory "/path/to/your/webroot"> CharsetSourceEnc UTF-8 CharsetDefault UTF-8 </Directory>PHP-FPM编码配置(若使用PHP-FPM)
在php-fpm.conf或对应pool配置文件中添加环境变量:env[LANG] = en_US.UTF-8 env[LC_ALL] = en_US.UTF-8重启PHP-FPM服务:
systemctl restart php-fpmmod_php编码配置(若使用mod_php)
编辑php.ini文件,确保默认字符集为UTF-8:default_charset = "UTF-8"重启Apache服务:
systemctl restart httpd验证修复效果
重新请求含重音/空格路径的PHP脚本,检查返回状态是否为200,同时查看ssl_access_log确认日志正常。
内容的提问来源于stack exchange,提问作者aNDy
相关产品推荐
相关产品推荐

