Laravel部署到Nginx必须修改两处:一是Nginx server块中root指向public目录、try_files含/index.php?$query_string;二是PHP-FPM中cgi.fix_pathinfo=0并重启服务。

直接说结论:Laravel 部署到 Nginx,核心要改的只有两处——Nginx 的 server 块配置(含 root、try_files、location ~ \.php$),以及 PHP-FPM 的 cgi.fix_pathinfo=0。其他都是可选加固或性能调优,不改也能跑,但可能出安全漏洞或 404。
必须改的 Nginx server 块:root 和 try_files 是命门
很多人部署后访问首页是 404 或直接下载 index.php,根本原因就是没把 root 指向 Laravel 的 public/ 目录,或者 try_files 写错了。
-
root必须设为项目public/目录的绝对路径,比如/var/www/myapp/public;写成/var/www/myapp就会找不到静态资源和入口 -
try_files $uri $uri/ /index.php?$query_string;这行不能少,也不能改成/index.php或漏掉$query_string,否则 Laravel 路由全挂,所有非根路径都 404 -
index必须包含index.php,顺序无所谓,但缺了它,访问/时 Nginx 不会自动找index.php
PHP-FPM 的 cgi.fix_pathinfo=0 是安全底线
不改这行,Nginx + PHP-FPM 组合存在路径解析漏洞:攻击者请求 /image.jpg/xxx.php 可能被错误地当作 PHP 执行,导致任意代码执行。这不是理论风险,是真实 CVE。
- 找到对应 PHP 版本的
php.ini,通常是/etc/php/8.1/fpm/php.ini(版本号按你实际装的填) - 搜索
cgi.fix_pathinfo,去掉注释(删掉前面的分号),值设为0:cgi.fix_pathinfo=0 - 改完必须重启
php8.1-fpm(或对应服务名),只 reload nginx 无效
location ~ \.php$ 里 fastcgi_param SCRIPT_FILENAME 必须用 $realpath_root
官方文档和很多博客用 $document_root,但在某些 Nginx 版本或符号链接场景下会出错,导致 502 或空白页。用 $realpath_root 更可靠。
- 推荐写法:
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; - 别再抄老教程里的
$document_root$fastcgi_script_name,尤其当你用了alias或软链部署时,$document_root可能指向错误路径 - 同时确认
fastcgi_pass指向正确的 socket 文件,常见路径是unix:/var/run/php/php8.1-fpm.sock,注意版本号匹配
容易被忽略的细节:404 错误页和 .env 权限
这两处不改不影响功能启动,但上线后立刻暴露问题。
- Laravel 的 404 页面不会自动生效,必须在 Nginx 配置里加
error_page 404 /index.php;,否则用户看到的是 Nginx 默认 404 -
.env文件权限必须是644或更严格(如600),绝不能是777;如果 Nginx 静态文件服务没关严,.env可能被直接下载,数据库密码全泄露 - 还要确保
storage/和bootstrap/cache/目录可写(chmod -R 775 storage bootstrap/cache),否则日志写不进、配置缓存生成失败
最常卡住人的其实是路径拼写和权限组合:比如 root 多写一个 /public、fastcgi_pass socket 路径里 PHP 版本号写错、cgi.fix_pathinfo 改了但没重启 php-fpm。部署前先 sudo nginx -t 和 sudo systemctl status php8.1-fpm 看一眼,比反复 reload 有用得多。


















