thinkphp6部署nginx必须手动配置path_info传递且rewrite规则须置于php location之前;否则路由404。因nginx不自动提供$_server['path_info'],需显式设置fastcgi_param path_info $fastcgi_path_info,并配对fastcgi_split_path_info规则,同时用if+rewrite fallback确保url重写生效。

ThinkPHP6 部署到 Nginx 必须手动补全 PATH_INFO 传递,否则所有路由都会 404;try_files 在多数 Nginx 环境(尤其是 phpEnv、旧版宝塔)中不可靠,if (!-e $request_filename) + rewrite 是当前最稳的 fallback 方案。
为什么访问 /index/test 直接 404,但 /index.php/s=/index/test 能通
这是典型的 PATH_INFO 未正确注入导致的问题。ThinkPHP6 默认启用 pathinfo 模式,依赖 $_SERVER['PATH_INFO'] 解析 URL,而 Nginx 不像 Apache 自动提供该变量。
-
fastcgi_param PATH_INFO $fastcgi_path_info;这行必须显式存在,且不能被注释 —— 宝塔升级 PHP 后常被重置,phpEnv 默认根本没这行 -
fastcgi_split_path_info规则需匹配 ThinkPHP 的入口结构,例如:^(/index\.php)(/.*)$,否则$fastcgi_path_info为空 - 若使用
public/index.php为 root,$document_root必须精确指向public/,多一层或少一层都会让SCRIPT_FILENAME错位
location 重写规则必须放在 location ~ \.php$ 之前
顺序错位是 90% 的“配置写了却无效”原因。Nginx location 匹配是前缀最长优先,location ~ \.php$ 会直接截断所有 .php 结尾请求,导致 rewrite 根本不执行。
- 在 server 块内,把以下块插在
location ~ \.php$**上方**: location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; } }-
last是关键:它让重写后重新进入 location 匹配流程,才能落到 PHP 处理块;用break或redirect都会失败 - 不要用
try_files $uri $uri/ /index.php?$query_string;—— 在 phpEnv、部分宝塔版本、OpenResty 旧编译中会触发重定向循环或 500
静态资源与敏感目录必须隔离
ThinkPHP6 的 app/、config/、runtime/、.env 一旦被 Web 可读,等于源码和数据库密码裸奔。
- 加这三段进 server 块,顺序无关,但必须存在:
location ~ ^/(app|config|database|runtime|vendor)/ { deny all; }location ~ /\.(env|git|htaccess|bak|swp)$ { deny all; }location ~* \.(js|css|png|jpg|gif|ico|svg|woff2?)$ { expires 1y; add_header Cache-Control "public, immutable"; }- 注意:
root必须设在 server 级,且值为/var/www/your_project/public;如果设在 location 内或路径错成.../public/(末尾斜杠),静态文件会 404
最容易被忽略的是 PHP-FPM 的 open_basedir 和 user.ini 冲突:Nginx 传了 open_basedir,但 PHP-FPM 池配置里又写了另一套,或者 public/.user.ini 里限制过死,会导致 require(): open_basedir restriction in effect。验证时别只看首页,一定要测一个不存在的路由 —— 返回 ThinkPHP 的 404 页面才算真正进框架,返回 Nginx 默认 404 就说明 rewrite 或 PATH_INFO 还没通。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











