nginx部署laravel核心是root必须指向public目录,否则暴露.env等敏感文件且所有路由404;必须配置try_files $uri $uri/ /index.php?$query_string,并在php块中用$realpath_root设置script_filename。

部署 Laravel 到 Nginx 服务器,核心不是“跑起来”,而是“安全地、正确地走对入口”。绝大多数 404、.env 泄露、No input file specified 报错,都源于 Nginx 路径和转发逻辑配错了。
root 必须指向 public 目录
这是最根本、最容易被忽略的一点。Nginx 的 root 值必须是项目中 public/ 子目录的绝对路径,不是整个 Laravel 项目的根目录。
- ✅ 正确:
root /var/www/myapp/public;—— 静态资源可访问,index.php是唯一合法入口 - ❌ 错误:
root /var/www/myapp;—— 访问https://yoursite.com/.env会直接下载配置文件,app/、config/、vendor/全部暴露
如果用了符号链接(如 /var/www/current → /var/www/releases/20260926),确保 current/public 是真实路径,或在 server 块里加 disable_symlinks off;。
location / 必须配 try_files
Laravel 所有非静态请求(比如 /users、/api/posts)都要由 public/index.php 统一处理。Nginx 默认不会这么做,必须显式声明。
- 必须写成:
try_files $uri $uri/ /index.php?$query_string; -
$query_string保证 GET 参数(如?page=2、?lang=zh)不丢失 - 不能用旧式 rewrite:
rewrite ^/(.*)$ /index.php?/$1 last;—— Laravel 5.3+ 不依赖 PATH_INFO,且易触发双解析漏洞
PHP 处理块要防穿透、保路径
处理 .php 文件的 location 块,既要防止恶意绕过,又要确保 PHP-FPM 加载到正确的文件。
-
SCRIPT_FILENAME 必须用
$realpath_root:fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
不用$document_root,否则在符号链接或某些权限场景下会报 “No input file specified” - 末尾加防护:
try_files $uri =404;—— 阻止类似/fake.php/xxx这类构造绕过重写、直执行任意 PHP 文件 -
fastcgi_pass要匹配你实际运行的 PHP-FPM 实例,常见值:
• Unix socket:unix:/var/run/php/php8.2-fpm.sock
• TCP:127.0.0.1:9000(需确认 PHP-FPM 已监听该端口)
补上基础安全与兼容项
上线前几处关键收尾,避免踩坑:
- 禁止敏感文件访问:
location ~ /\.(env|git|htaccess|log|lock)$ { deny all; } - HTTPS 透传:
fastcgi_param HTTPS on;或更稳妥地根据 header 判断,否则url()、asset()可能生成 http 链接 - APP_URL 和实际访问协议一致:检查
.env中APP_URL=https://yoursite.com,别留 http - 静态资源缓存(可选但推荐):
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { expires 1y; add_header Cache-Control "public, immutable"; }











