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

如何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 03:55:39