laravel 11部署必须将nginx root设为public目录,配置try_files $uri $uri/ /index.php?$query_string,并用$realpath_root指定script_filename;否则暴露敏感文件、路由404且静态资源加载失败。

升级 Laravel 11 后访问首页空白、路由全部 404 或静态资源加载失败,不是代码写错了,而是 Web 服务器仍沿用旧版配置逻辑——Laravel 11 的入口行为更严格,对 public 目录指向、QUERY_STRING 透传、符号链接处理和敏感路径拦截的要求全面提高。
Nginx 配置必须重检的三项硬性变更
第一步:确认 root 指向的是 【/var/www/your-app/public】,不是项目根目录。Laravel 11 默认禁用 .env 直接访问且强化了入口校验,若 root 错配为 /var/www/your-app,Nginx 会直接暴露 app/、config/、.env 等路径,同时所有路由因未经过 public/index.php 而彻底失效。
第二步:location / 块中必须使用 try_files $uri $uri/ /index.php?$query_string;。Laravel 11 的 URL 生成器(如 route()、url())强依赖完整查询参数,用 $args 或省略会导致?page=2、_token=xxx 等参数丢失,表单提交失败或分页中断。
第三步:PHP 处理块中 fastcgi_param SCRIPT_FILENAME 必须写成 $realpath_root$fastcgi_script_name。Laravel 11 在部署中大量使用符号链接(如 current → releases/20260805),若继续用 $document_root,PHP-FPM 将报 “No input file specified”,且错误日志不提示真实路径问题。
Apache 配置需同步更新的关键点
方法一:启用 .htaccess 并确保 AllowOverride All 生效
打开 /etc/apache2/sites-available/your-site.conf,在 <directory><br> AllowOverride All<br> Require all granted<br></directory>
Apache 2.4+ 默认禁用覆盖,AllowOverride None 会让 public/.htaccess 中的 RewriteCond 和 RewriteRule 完全失效,导致所有非物理路径请求返回 404。
方法二:验证 .htaccess 内容是否为 Laravel 11 官方标准版本
public/.htaccess 文件必须与 Laravel 11 源码一致,尤其注意两处:
① RewriteCond %{REQUEST_FILENAME} !-d 和 !-f 顺序不可颠倒;
② RewriteRule 行末尾必须带 [QSA,L],缺一不可。任何手动删减注释、空行或添加自定义规则都可能触发 Apache 解析异常,表现为 CSS/JS 404 或页面白屏。
强制 HTTPS 下必须补上的三处透传配置
① Nginx server 块中添加:fastcgi_param HTTPS on;
仅当监听 443 端口时生效,否则 Laravel 11 的 URL 生成器仍输出 http:// 链接,密码重置邮件、队列任务回调全部失效。
② 若使用 CDN 或反向代理(如 Cloudflare),必须在 Nginx 中加:fastcgi_param HTTP_X_FORWARDED_PROTO $scheme;
并确保 Laravel 11 的 App\Http\Middleware\TrustProxies 已在 $proxies 中配置对应 IP 段,否则 session.secure 和 CSRF token 验证将拒绝合法请求。
③ .env 中 APP_URL 必须与 Nginx server_name 完全一致,包括协议、域名、端口(非标准端口需显式写出)。例如 server_name example.com; → APP_URL=https://example.com;若漏掉 s 或多加 /,Laravel 11 的 asset() 辅助函数将拼出错误路径,前端资源全部 404。
静态资源加载失败的快速定位与修复
第一步:检查 Nginx 是否有独立 location 块匹配静态文件扩展名
在 location / 之前插入:
location ~* \.(js|css|png|jpg|gif|svg|woff2?|ico|webp)$ {<br> try_files $uri =404;<br> expires 1y;<br> add_header Cache-Control "public, immutable";<br>}
第二步:确认该 location 块位置在 location / 之前
Nginx 匹配规则按配置顺序执行,若此块放在 location / 之后,所有 .js 请求会被先匹配到 / 块并转发给 index.php,PHP 又无对应路由,最终返回 404 页面而非资源文件。
第三步:执行 sudo nginx -t && sudo systemctl reload nginx
配置语法测试通过后必须 reload,不能只 restart,否则 PHP-FPM 进程可能未重新加载 fastcgi_param 设置,导致 QUERY_STRING 仍丢失。











