Nginx 配置 Laravel 10 伪静态需将 root 指向 public 目录,用 try_files $uri $uri/ /index.php?$query_string; 处理请求,PHP 块中补全 fastcgi_param 并禁用敏感文件访问。

在 Nginx 中配置 Laravel 10 的伪静态,核心不是“重写 URL”,而是让所有非真实文件/目录的请求,统一交由 public/index.php 处理——这是 Laravel 路由生效的前提。配置错一步,就会 404、跳 index.php、参数丢失或报 “No input file specified”。
必须把 root 指向 public 目录
默认新建站点时,Nginx 的 root 指向的是项目根目录(如 /www/myapp),但 Laravel 10 的入口是 public/index.php。若不改,.env 可能被直接下载,index.php 找不到自动加载器,连欢迎页都打不开。
- 在控制面板(如 phpEnv 或宝塔)中进入站点「设置」→「网站目录」,将路径改为
/www/myapp/public(注意:只到目录,不要带/index.php) - 保存后务必点击「重载 Nginx」,无需重启服务
- 验证:访问
http://your-domain/.env应返回 403 或 404;访问首页应显示 Laravel 欢迎页
location / 块里只用 try_files,别碰 rewrite
Laravel 10 不依赖 PATH_INFO,也不接受 Apache 风格的 rewrite 规则。网上常见的 rewrite ^/(.*)$ /index.php?/ last; 在新版 Nginx 下会导致路由初始化失败。
- 在
nginx.conf的location / { }块内,完整替换为:
try_files $uri $uri/ /index.php?$query_string;
- 确保这行在
location ~ \.php$块之前(Nginx 匹配顺序敏感) - 删掉所有
if (!-e $request_filename)、rewrite等旧规则,它们与try_files冲突 - 空格和符号不能错:
$query_string前是?,不是&
PHP 处理块要补全 fastcgi_param
漏掉关键参数会导致 APP_ENV 读成 production、路由缓存失效、甚至 php artisan 命令在 Web 请求中行为异常。
- 在
location ~ \.php$块内,紧接include fastcgi_params;后追加三行:
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param REQUEST_URI $request_uri;
- 务必用
$realpath_root,不用$document_root(防符号链接问题) - 不要手动写死路径,比如
/var/www/.../index.php
其他必须检查项
-
APP_URL 必须与访问域名完全一致:比如
APP_URL=https://example.com,末尾不加/;Nginx 的server_name也得包含该域名 -
禁止访问敏感文件:加一段
location ~ /\.(env|git|log)$ { deny all; } -
静态资源别误转发:确保有独立
location ~ \.(js|css|png|jpg|gif|svg|woff2?)$块,内容为try_files $uri =404;,且放在location /之前 -
权限与 open_basedir:若日志写不进
storage/logs或缓存生成失败,检查是否开了「防跨站攻击」,并清空open_basedir


















