如何在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
相关产品推荐
相关产品推荐

