nginx配置laravel需确保请求正确转发至public/index.php:try_files $uri $uri/ /index.php?$query_string;app_url须与server_name完全一致;静态资源需独立location块匹配;部署后须检查权限、清缓存并验证.env配置。

nginx 配置 Laravel 时 try_files 必须写对
很多 404 不是路由问题,而是 Nginx 根本没把请求转发给 index.php。核心就一条:Laravel 的入口统一走 public/index.php,Nginx 得主动“兜底”。
常见错误是照抄 Apache 的 .htaccess 思路,或者漏掉 $args 导致 GET 参数丢失。
-
try_files $uri $uri/ /index.php?$query_string;是最稳妥的写法,$query_string确保 URL 参数(如?page=2)不被丢弃 - 别用
/index.php?/$1这类旧式写法,Laravel 5.3+ 已不依赖 PATH_INFO - 如果部署在子目录(比如
example.com/app/),root指向的是public目录,不是项目根目录;路径重写逻辑要配合location块范围调整
Laravel 的 APP_URL 和 Nginx server_name 要对得上
看似无关,但会影响生成 URL、密码重置链接、队列任务中的绝对路径——这些都依赖 APP_URL,而它常被设成开发环境值(http://localhost),上线后不改,邮件里点开就是 404。
Nginx 的 server_name 决定了它响应哪个域名的请求,APP_URL 必须与之完全一致(协议 + 域名 + 端口,如果非标准端口)。
- 检查
.env文件:APP_URL=https://yourdomain.com(注意末尾不要加/) - 确认 Nginx
server_name yourdomain.com www.yourdomain.com;包含所有实际访问的域名 - 如果用了 CDN 或反向代理,且真实请求头带
X-Forwarded-Proto,还需在AppServiceProvider中调用URL::forceScheme('https'),否则生成的链接仍是http
静态资源 404?检查 location ~ \.(js|css|png|jpg|gif|svg|woff2?)$ 是否误配
Laravel 的 public 目录下放了所有可直接访问的静态文件,Nginx 应该原样返回,而不是再扔给 PHP 处理。但很多人复制模板时,把正则写成了 \.php$ 以外全交由 index.php,结果连 mix-manifest.json 都 404。
- 确保有独立的静态文件 location 块,且放在
location /之前(Nginx 匹配优先级按顺序) - 推荐写法:
location ~ ^/assets/|\.js$|\.css$|\.png$|\.jpg$|\.gif$|\.svg$|\.woff2?$ { try_files $uri =404; } - 如果用了 Laravel Mix,且资源加了 hash(如
app.abc123.js),别用太窄的正则,漏掉.js后面的哈希部分会导致 404
部署后页面空白或报错 Whoops, looks like something went wrong
这通常不是 Nginx 配置问题,而是权限、缓存或环境没切过来。Nginx 日志里往往只显示 500 或空响应,得往 Laravel 自身查。
- 先看
storage/logs/laravel.log,90% 是file_put_contents(/path/storage/logs/laravel.log): failed to open stream: Permission denied—— 运行用户(如www-data)没写入storage和bootstrap/cache权限 - 清缓存命令必须在部署后跑:
php artisan config:clear && php artisan cache:clear && php artisan view:clear,否则仍读旧配置 - 确认
APP_DEBUG=false,否则生产环境暴露敏感信息;但调试阶段可临时设为true看具体报错
真正卡住的点,往往是 storage 目录属主没改,或者 .env 里数据库密码错了却没报连接异常——因为 Nginx 把错误吞了,只返回空白页。










