thinkphp入口文件必须隐藏以避免url冗余、暴露框架细节及安全误判;nginx需用try_files配合fastcgi_split_path_info正确解析path_info,且tp6与tp5.1的root指向public目录位置不同。

ThinkPHP入口文件为什么必须隐藏
不隐藏 index.php 会导致 URL 中反复出现它,比如 http://example.com/index.php/home/user/info,既难看又暴露框架细节。更关键的是,部分安全扫描工具会把带 index.php 的路径当成潜在攻击面标记——哪怕你没开调试模式,也容易被误判为“未加固”。Nginx 本身不支持 ThinkPHP 的 PATH_INFO 路由解析,必须靠重写规则把请求“喂”给 index.php,同时让 PHP 脚本能正确拿到原始路径。
Nginx location 块里不能只写 try_files
很多人直接抄 try_files $uri $uri/ /index.php?$query_string;,结果发现路由 404 或参数丢失。这是因为 ThinkPHP 默认用 PATH_INFO 模式(如 /home/user/info),而 $query_string 只传 QUERY_STRING,不包含 PATH_INFO。Nginx 需要显式把路径塞进 PATH_INFO 环境变量:
- 必须用
fastcgi_split_path_info拆分路径,否则$_SERVER['PATH_INFO']为空 -
fastcgi_param PATH_INFO必须手动设置,不能依赖默认值 - 如果项目部署在子目录(如
/app/),location匹配前缀和fastcgi_split_path_info正则都要同步调整
典型可用配置段:
location / {
try_files $uri $uri/ /index.php$uri;
}
location ~ \.php {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
include fastcgi_params;
}
Apache .htaccess 规则在 Nginx 下直接失效
ThinkPHP 文档里给的 Apache .htaccess 规则(比如 RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L])在 Nginx 里完全不能用。Nginx 没有 mod_rewrite 那套机制,也不认 [QSA,PT,L] 标志。强行翻译成 rewrite 指令容易出循环重定向或 PATH_INFO 错乱。最稳妥的方式是放弃 rewrite,改用 try_files + fastcgi_split_path_info 组合——前者做静态资源兜底,后者专供动态路由解析。
- 不要用
rewrite ^/(.*)$ /index.php/$1 last;,它会让 PATH_INFO 多一层斜杠 - 不要在
location ~ \.php$里再套rewrite,Nginx 不允许嵌套 - 如果用了 think-swoole 或 Swoole HTTP 服务器,根本不需要 Nginx 重写——那是另一个运行模式,别混在一起配
TP6 和 TP5.1 的 public 目录位置影响 root 设置
TP6 把 public 当作 Web 根目录,TP5.1 默认是项目根目录下放 index.php。这意味着 Nginx 的 root 指向位置完全不同:
- TP6:root 必须指向
/path/to/your/project/public,否则index.php找不到 - TP5.1:root 指向
/path/to/your/project,但需确保index.php在该目录下且可执行 - 如果 TP6 项目被错误地配置成 TP5.1 的 root,会出现 “No input file specified.” 错误,因为 Nginx 找不到
public/index.php
检查方法很简单:curl -I http://your-domain.com/index.php,看返回的 Server 头和实际响应体是否匹配预期路径。
PATH_INFO 的解析精度、子目录部署时的正则边界、public 目录层级错位——这三个点只要漏掉一个,URL 就会断在中间,而且错误表现还不一样:有时 404,有时 500,有时路由全乱。配完别急着测业务逻辑,先 curl 几个典型路由看响应头和 body 是否干净。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










