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

Apache服务器含特殊字符路径下PHP脚本404问题求助

Apache路径含重音/空格时PHP脚本返回404(HTML正常)的问题诊断与修复

问题现象

  • 服务器存在含空格或é、á、ö等重音字符的文件路径,同时满足以下两个条件时,返回自定义的“File not found.”提示:
    1. 请求路径包含空格/重音字符
    2. 请求的是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)在接收路径时编码转换错误,无法匹配实际文件。

修复步骤

  1. 确认系统默认编码
    执行命令查看系统locale:

    locale
    

    确保输出包含UTF-8(如LANG=en_US.UTF-8),若未配置需先将系统locale设置为UTF-8。

  2. 配置Apache编码规则
    在Apache主配置文件(httpd.conf)或虚拟主机配置块中添加以下指令,确保URL解码使用UTF-8:

    AddDefaultCharset UTF-8
    

    针对目标目录,可补充:

    <Directory "/path/to/your/webroot">
        CharsetSourceEnc UTF-8
        CharsetDefault UTF-8
    </Directory>
    
  3. 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-fpm
    
  4. mod_php编码配置(若使用mod_php)
    编辑php.ini文件,确保默认字符集为UTF-8:

    default_charset = "UTF-8"
    

    重启Apache服务:

    systemctl restart httpd
    
  5. 验证修复效果
    重新请求含重音/空格路径的PHP脚本,检查返回状态是否为200,同时查看ssl_access_log确认日志正常。

内容的提问来源于stack exchange,提问作者aNDy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 06:25:10