Laravel怎么解决Nginx 404问题_Laravel路由重写规则配置【避坑】

2次阅读

laravelnginx下404主因是location块未配置重写规则,导致请求未经index.php处理;需用try_files $uri $uri/ /index.php?$query_string;并确保root指向public目录。

Laravel怎么解决Nginx 404问题_Laravel路由重写规则配置【避坑】

Laravel 在 Nginx 下出现 404,几乎全是 location 块里没正确配置重写规则,导致请求根本没进 index.php,更别提 Laravel 路由了。

为什么 Nginx 默认不支持 Laravel 路由

Nginx 不像 apache 自带 .htaccess 支持,它不会自动把所有非静态资源请求转发给 index.php。如果没显式配置重写,访问 /users 这类路由时,Nginx 会直接去文件系统找 public/users 目录或文件——当然找不到,于是返回 404。

关键点:Laravel 的所有动态路由必须经由 public/index.php 入口统一处理。

必须用的 Nginx 重写规则(Laravel 9+ 推荐)

在 server 块中,root 指向 public/ 目录后,直接替换掉默认的 location / 块,用以下配置:

location / {     try_files $uri $uri/ /index.php?$query_string; }

这个规则的意思是:先尝试匹配真实文件或目录;都不命中,就重写到 /index.php 并保留原始查询参数。这是最简且兼容性最好的写法。

  • 不要用 rewrite ^/(.*)$ /index.php?/$1 last; —— 容易破坏 POST 数据和上传文件
  • 不要漏掉 $query_string —— 否则 ?page=2&sort=name 会丢失
  • 确保 root 指向的是项目根目录下的 public,比如 root /var/www/myapp/public;

静态资源 404 的常见干扰项

有时候你以为是路由问题,其实是 CSS/js 文件 404 导致页面加载异常,误判为 Laravel 路由失效。

  • 检查浏览器开发者工具 Network 面板,看具体哪个 URL 返回了 404 —— 是 /css/app.css 还是 /posts
  • 确认 public/ 下确实存在该文件,路径大小写要完全一致(linux 区分大小写)
  • 如果用了 Laravel Mix 或 Vite,确保已运行 npm run build,且生成文件在 public/ 下而非 resources/
  • 避免在 location ~ .php$ 块里加 try_files —— 这会导致 PHP-FPM 请求被错误拦截

重启与验证步骤不能跳过

改完 Nginx 配置后,不是 reload 就完事了:

  • 先执行 sudo nginx -t 确认语法无误
  • sudo systemctl reload nginx(或 nginx -s reload
  • 清空浏览器缓存,或用隐身窗口测试 —— 有些 404 是 301 缓存导致的假象
  • 临时在 routes/web.php 里加一条 Route::get('/test', fn() => 'ok');,访问 /test 看是否响应,快速定位是 Nginx 层还是 Laravel 层的问题

真正容易被忽略的是:Nginx 配置可能被多个 include 文件覆盖,比如 conf.d/*.confsites-enabled/ 下的其他文件,冲突时以最后加载的为准 —— 别只盯着主配置改。

text=ZqhQzanResources