使用FastCGI Unix套接字时含空格路径的PHP文件无法找到
问题背景
将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

