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

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/*.conf 或 sites-enabled/ 下的其他文件,冲突时以最后加载的为准 —— 别只盯着主配置改。











