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

使用FastCGI Unix套接字时含空格路径的PHP文件无法找到

迁移网站后含空格的PHP文件无法访问(Apache+PHP-FPM环境)

问题背景

将Windows XAMPP上的网站迁移到Ubuntu 24.04(Apache 2.4.62 + PHP 7.4.33)后,无空格的PHP文件正常运行,但路径含空格的文件(如test name.php)返回404错误,提示"Primary script unknown"。

已通过以下命令确认文件存在:

ls "/var/www/html/tempdir/test name.php"

从Apache日志中发现关键异常:

[proxy_fcgi:debug] [pid 14742:tid 14827] mod_proxy_fcgi.c(1078): [client 127.0.0.1:35246] AH01076: url: fcgi://localhost/var/www/html/tempdir/test%20name.php proxyname: (null) proxyport: 0
[proxy_fcgi:error] [pid 14742:tid 14827] [client 127.0.0.1:35246] AH01071: Got error 'Primary script unknown'

问题原因

Apache把URL编码后的%20(空格的编码形式)直接传递给了PHP-FPM,而PHP-FPM会将test%20name.php当作真实文件名查找,但服务器上实际文件名是带空格的test name.php,因此找不到目标文件。

解决方案

方法1:修改PHP-FPM代理配置(推荐)

如果你的Apache配置使用ProxyPassMatch,将路径参数替换为%{REQUEST_FILENAME},确保传递解码后的真实路径:

原配置:

ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://localhost/var/www/html/$1

修改后:

ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://localhost/%{REQUEST_FILENAME}

若使用Unix套接字(与日志中的/run/php/php7.4-fpm.sock匹配),可改用SetHandler配置,自动处理路径解码:

<VirtualHost *:80>
    ServerName your-domain.com
    DocumentRoot /var/www/html

    <FilesMatch "\.php$">
        SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost/var/www/html/"
    </FilesMatch>

    # 其他必要配置(如日志、权限)
</VirtualHost>

方法2:启用自动路径解码

确保mod_proxy_fcgi模块已加载,在Apache全局配置或虚拟主机配置中添加:

ProxyFCGIBackendType GENERIC

该配置会让Apache在传递路径给FastCGI后端前,自动解码URL编码字符(包括空格)。

验证操作

修改配置后重启Apache:

sudo systemctl restart apache2

再次访问含空格的PHP文件,确认正常加载。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 11:34:51