laravel项目nginx部署异常90%因root未指向public目录或try_files与script_filename配置不匹配;root必须为/var/www/myapp/public,配合try_files $uri $uri/ /index.php?$query_string及fastcgi_param script_filename $realpath_root$fastcgi_script_name。

将 Laravel 项目部署到 Nginx 服务器时,若 root 指向项目根目录而非 public 子目录,会直接暴露 .env、config/、app/ 等敏感路径,同时所有路由返回 404——这不是代码问题,是 Nginx 根本没走对入口。
基础服务入口配置
第一步:设置 root 指向 public 目录
在 server 块中写入:root /var/www/myapp/public;。这一步不可省略或替换为项目根路径,否则 【.env 文件可被任意下载】。
第二步:声明默认首页
添加 index index.php index.html index.htm;,确保访问根路径时能正确加载 index.php。
第三步:启用 Laravel 路由转发
在 location / 块中写入:try_files $uri $uri/ /index.php?$query_string;。漏掉它,/users 或 /api/posts 这类路径会直接 404,PHP 根本收不到请求。
PHP-FPM 处理规则
方法一:复用 fastcgi-php.conf(推荐)
添加 location 块:location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; }。注意必须用 $realpath_root,$document_root 在符号链接部署下会拼错路径,导致 “No input file specified” 错误。
方法二:手动展开参数(适合调试)
不引用 snippets 时,需显式写出全部 fastcgi_param:fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;、fastcgi_param PATH_INFO $fastcgi_path_info;、fastcgi_param QUERY_STRING $query_string;。PATH_INFO 在部分中间件或旧路由中仍被依赖,漏掉可能造成 404。
安全防护与防穿透
① 禁止访问敏感文件
在 server 块内添加:location ~ /\.(env|git|htaccess|ini|log|sh|sql|yml|yaml|xml)$ { deny all; }。Nginx 不读 .htaccess,但这类后缀若未拦截,可能被直接返回源码。
② 封锁敏感目录访问
添加:location ~ ^/(resources|app|config|bootstrap|storage|vendor)/ { deny all; }。这条规则必须放在 location / 之前,否则会被覆盖;它能阻断 /resources/views/welcome.html 这类直接读取视图源码的请求。
③ 防止 PHP 文件被当作静态资源执行
在 PHP location 块末尾加上:try_files $uri =404;。没有它,攻击者可构造 /fake.php/xxx 绕过重写规则,触发任意 PHP 文件执行。
HTTPS 与代理头透传
若使用 HTTPS,必须在 server 块中添加:fastcgi_param HTTPS on;。否则 Laravel 的 url()、asset() 会生成 http:// 链接,前端加载资源失败或混合内容警告。
若经 Cloudflare、Nginx 反代或负载均衡器接入,还需加:fastcgi_param HTTP_X_FORWARDED_PROTO $scheme;,并在 Laravel 中启用 App\Http\Middleware\TrustProxies。
APP_URL 必须与实际访问协议一致,例如 APP_URL=https://example.com。不匹配会导致生成的绝对 URL 错误,API 返回的跳转地址失效。











