Docker+Nginx反向代理环境访问.php文件报Primary script unknown错误
问题根因
你的问题核心出在Nginx代理层的转发配置规则:
- 代理层
location /web对应的proxy_pass http://nginx-web;末尾没有加斜杠,此时请求路径中的/web前缀会被完整传递给上游的web容器,而非被截断:- 直接访问
http://web.local/web/index.php时,上游web容器拿到的请求路径是/web/index.php,拼接root目录后得到的文件路径为/var/www/web/web/index.php,该路径不存在,因此PHP-FPM返回Primary script unknown错误。 - 访问不带
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。
解决方案
有两种可落地的修复方案,任选其一即可:
- 修改代理层Nginx配置:给对应
proxy_pass末尾添加斜杠,转发时会自动截断匹配到的/web前缀:
location /web { proxy_pass http://nginx-web/; } # 同步修改/portal、/api对应的location块,给proxy_pass都加上末尾斜杠
- 修改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
相关产品推荐
相关产品推荐

