Laravel预发布环境触发异常时显示Nginx 404页面本地正常如何解决
问题排查方案
1. Nginx 站点根目录与重写规则校验
这是概率最高的问题原因,优先排查:
- 确认站点配置的
root参数指向Laravel项目的public目录,而非项目根目录 - 确认
location /块中存在正确的重写规则,示例正确配置如下:
server { listen 80; server_name 你的站点域名; root /www/你的项目路径/public; # 必须指向public目录 index index.php index.html; location / { try_files $uri $uri/ /index.php?$query_string; # 不可缺少这行配置 } # 后续php处理配置 }
如果缺少上述try_files配置,当Laravel触发异常返回非200状态码时,Nginx会直接查找对应路径的静态文件,找不到就返回404而非交给Laravel处理异常渲染。
修改配置后执行nginx -t校验配置合法性,校验通过后执行nginx -s reload重载配置生效。
2. FastCGI 错误拦截配置校验
预发布/生产环境的Nginx常默认开启fastcgi_intercept_errors参数:
- 该参数值为
on时,只要PHP返回的HTTP状态码≥400,Nginx会直接忽略PHP返回的响应内容,用自身的错误页替代 - 此时Laravel正常渲染的500异常页会被拦截,Nginx如果没配置对应500错误页,就会返回默认的404页
- 临时将配置改为
fastcgi_intercept_errors off;,重载Nginx后测试即可验证问题
3. Laravel 异常处理器校验
确认项目无自定义异常跳转逻辑:
- 检查
app/Exceptions/Handler.php的render方法,是否存在异常触发时强制跳转到不存在路由的逻辑 - 确认非本地环境下没有强制覆写异常响应为404的自定义配置
4. 目录权限校验
确认项目目录权限配置正确:
storage、bootstrap/cache目录需要给Nginx运行用户(通常为www-data、nginx)开放读写权限- 权限不足时Laravel可以写入日志,但无法正常渲染异常页,也会触发Nginx返回404
内容的提问来源于stack exchange,提问作者code-8
相关产品推荐
相关产品推荐

