如何修改Apache发送给PHP-FPM容器的脚本路径以适配挂载差异?
解决方案
要让Apache传递给PHP-FPM的脚本路径匹配PHP-FPM容器内的挂载位置,你需要覆盖Apache默认传递给FastCGI的SCRIPT_FILENAME和DOCUMENT_ROOT环境变量,替换为PHP-FPM容器中的路径(/var/task)。
基础配置(无PATH_INFO需求)
修改你的Apache虚拟主机<FilesMatch>块,添加ProxyFCGISetEnv或ProxyFCGISetEnvExpr指令:
<FilesMatch \.php$> SetHandler "proxy:fcgi://myapp-php-fpm:9000" # 将脚本路径替换为PHP-FPM容器内的路径格式 ProxyFCGISetEnvExpr SCRIPT_FILENAME "/var/task%{REQUEST_URI}" # 设置PHP-FPM侧的文档根目录 ProxyFCGISetEnv DOCUMENT_ROOT "/var/task" </FilesMatch>
带PATH_INFO的配置(适配URL包含额外路径的场景)
如果你的应用需要处理类似index.php/foo/bar这类带PATH_INFO的URL,可以用正则提取拆分路径:
<FilesMatch \.php$> SetHandler "proxy:fcgi://myapp-php-fpm:9000" # 提取脚本文件名部分,替换为PHP-FPM路径 ProxyFCGISetEnvExpr SCRIPT_FILENAME "/var/task%{REQUEST_URI_REGEX:^(.+\.php)}" # 提取PATH_INFO部分并传递 ProxyFCGISetEnvExpr PATH_INFO "%{REQUEST_URI_REGEX:(/.*)$}" ProxyFCGISetEnv DOCUMENT_ROOT "/var/task" </FilesMatch>
原理说明
Apache默认会把自身容器内的本地文件路径(比如/home/wwwdata/myapp/index.php)作为SCRIPT_FILENAME传给PHP-FPM,但PHP-FPM容器内的代码挂载在/var/task,所以必须强制覆盖这个环境变量,让PHP-FPM能找到正确的文件位置——这和你在Nginx中设置fastcgi_param SCRIPT_FILENAME的逻辑完全一致。
注意:确保你的Apache已经启用了mod_proxy和mod_proxy_fcgi模块,这是使用proxy:fcgi://协议的前提。
内容的提问来源于stack exchange,提问作者amacrobert
相关产品推荐
相关产品推荐

