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

Docker+Nginx反向代理环境访问.php文件报Primary script unknown错误

问题根因

你的问题核心出在Nginx代理层的转发配置规则:

  • 代理层location /web对应的proxy_pass http://nginx-web;末尾没有加斜杠,此时请求路径中的/web前缀会被完整传递给上游的web容器,而非被截断:
    1. 直接访问http://web.local/web/index.php时,上游web容器拿到的请求路径是/web/index.php,拼接root目录后得到的文件路径为/var/www/web/web/index.php,该路径不存在,因此PHP-FPM返回Primary script unknown错误。
    2. 访问不带index.php的http://web.local/web时,web容器的try_files $uri $uri/ /index.php$is_args$args规则会触发内部重写,将路径重写为/index.php,此时拼接得到的路径为/var/www/web/index.php,文件存在所以可以正常访问。

这个逻辑也和你测试时的结果完全吻合:访问http://web.local/web/help.php时,try_files找不到对应文件触发重写,所以return输出的路径是/var/www/web/index.php。

解决方案

有两种可落地的修复方案,任选其一即可:

  1. 修改代理层Nginx配置:给对应proxy_pass末尾添加斜杠,转发时会自动截断匹配到的/web前缀:
location /web {
    proxy_pass http://nginx-web/;
}
# 同步修改/portal、/api对应的location块,给proxy_pass都加上末尾斜杠
  1. 修改web服务层Nginx配置:添加重写规则去掉请求路径中的/web前缀:
# 在web容器default.conf的server块内添加以下规则
rewrite ^/web(.*)$ $1 break;
变量取值说明

你询问的两个变量取值规则如下:

  • $document_root:固定取当前请求所属的server块或匹配的location块中配置的root参数值,你的web容器server块配置的root是/var/www/web,所以该变量值固定为/var/www/web。
  • $fastcgi_script_name:取当前请求的最终URI路径,如果请求触发了内部重写规则,则取重写后的路径,未触发重写则取上游转发过来的原始请求路径。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 12:06:03