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

如何在Docker的NGINX中成功实现PHP前端控制器模式?

解决Nginx+PHP-FPM容器化部署中根路径403的问题

问题原因

你的Nginx配置中,index index.php指令会优先在本地文件系统查找index.php文件。生产环境下Nginx容器没有这个文件时,try_files $uri $uri/ /index.php?$query_string里的$uri/会触发目录索引检查,而Nginx默认关闭目录索引,因此返回403错误,而非跳转到/index.php触发PHP-FPM代理。

可行解决方法

方法1:调整try_files跳过目录检查

修改location /块的try_files指令,移除$uri/:

location / {
    # 直接跳过目录检查,找不到文件就跳转到index.php
    try_files $uri /index.php?$query_string;
}

这样请求根路径/时,Nginx找不到对应文件,会直接触发/index.php的请求,匹配到.php的location块,代理到PHP-FPM容器处理。

方法2:在Nginx容器中添加空index.php占位

无需修改Nginx配置,在构建Nginx镜像时,给/var/www/html目录添加一个空的index.php文件:

# Nginx Dockerfile示例
FROM nginx:alpine
COPY nginx.conf /etc/nginx/conf.d/default.conf
# 添加空的index.php占位
RUN touch /var/www/html/index.php

Nginx的index指令会找到这个本地文件,进而触发.php的location块,代理到PHP-FPM容器的真实index.php文件。

方法3:直接配置根路径的代理规则

添加一个精准匹配根路径/的location块,直接代理到PHP-FPM:

location = / {
    fastcgi_pass my_app_php:9000;
    include /etc/nginx/fastcgi_params;
    fastcgi_param SCRIPT_FILENAME /var/www/html/index.php;
    fastcgi_param QUERY_STRING $query_string;
}

这个规则优先级最高,会直接处理根路径请求,无需依赖本地文件。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 14:36:12