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

Docker部署Laravel时Nginx无法加载public静态文件返回404

问题根因

静态资源全部返回404的核心原因是Nginx容器内不存在对应的静态文件,和你配置的Nginx规则、宿主机反向代理规则无关:

  • 现有架构下,只有匹配.php后缀的请求会被Nginx转发到PHP-FPM容器执行,css、js、图片等静态资源请求,是Nginx直接读取自身容器内/var/www/html/public路径下的文件返回,不会向后端PHP容器发起请求。
  • 从你贴的容器启动命令看,启动PHP容器时挂载了.env配置文件和storage目录,但启动Nginx容器时没有挂载任何项目代码目录,也没有在Nginx镜像构建时打入静态资源,Nginx容器内部的/var/www/html/public路径实际没有对应静态文件,自然找不到资源。
  • 首页动态内容能正常加载,是因为请求根路径/时,Nginx会按index规则查找index.php,属于php后缀请求,直接转发给持有完整项目代码的PHP容器执行,所以动态逻辑正常;静态资源请求不属于php后缀,Nginx在自身文件系统找不到对应文件后,按配置fallback到/index.php,但Laravel路由表中没有对应静态路径的路由,最终返回404。
排查验证

启动容器后执行以下命令,查看Nginx容器内public目录的文件列表,即可确认问题:

docker exec -it subscription_manager_nginx ls /var/www/html/public

如果输出中没有css、js、images、favicon.ico等静态文件/目录,即可判定是上述原因。

解决方案

二选一即可:

  • 生产环境推荐方案:构建Nginx镜像时,直接把Laravel项目public目录下的所有文件复制到镜像内的/var/www/html/public路径。这种方式不需要在启动时额外挂载目录,Nginx可以直接读取本地静态文件,性能最优,也避免了多容器共享目录的一致性问题。
  • 和本地开发对齐的方案:启动Nginx容器时,将项目代码(至少是public目录)挂载到容器内的/var/www/html路径,保证Nginx能读取到静态资源。如果你的项目代码都打包在PHP镜像内,可以创建共享命名卷,让PHP容器和Nginx容器共用同一份代码目录,注意挂载时不要覆盖.env和storage的现有挂载配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:21:32