ThinkPHP在Nginx下隐藏index.php本质是将所有非静态请求统一交由public/index.php处理,需三者协同:Nginx配置(root指向public目录、location /与~.php$均配try_files $uri $uri/ /index.php?s=$uri&$args;)、框架启用路由('url_route_on'=>true)且依赖s参数而非PATH_INFO、静态资源可正常访问(200响应)。

ThinkPHP 在 Nginx 下隐藏 index.php,本质是让所有动态请求(如 /user/profile)不经过真实文件路径匹配,而是统一交由 public/index.php 入口处理,再由框架解析路由。这需要 Nginx 配置、项目部署结构和 ThinkPHP 自身设置三者协同,缺一不可。
确认项目部署结构正确
必须确保 Nginx 的 root 指向项目的 public/ 目录,而不是整个项目根目录。例如:
- 项目完整路径为
/var/www/myapp/ - 则 Nginx 中应配置:
root /var/www/myapp/public; - 这样
$document_root/index.php才能准确对应到真实的public/index.php - 若 root 错设为
/var/www/myapp,Nginx 将找不到入口文件,直接返回 404
配置 Nginx server 块的核心规则
在站点的 server 配置中,需同时定义两个关键 location 块,并确保它们配合工作:
-
主请求转发(location /):拦截所有非静态资源访问,优先尝试找真实文件或目录;失败则转给
index.php处理
推荐写法:location / {<br> try_files $uri $uri/ /index.php?s=$uri&$args;<br>} -
PHP 脚本处理(location ~ \.php$):必须加
try_files防止 Nginx 直接按字面匹配不存在的 PHP 文件而报 404
推荐写法:location ~ \.php$ {<br> try_files $uri /index.php?s=$uri&$args;<br> fastcgi_pass 127.0.0.1:9000;<br> fastcgi_index index.php;<br> fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;<br> include fastcgi_params;<br>} - 不要在 PHP 块中使用
rewrite或if,易引发 PATH_INFO 解析异常;try_files更安全可靠
检查 ThinkPHP 的路由与 URL 模式设置
框架侧需启用路由并适配 Nginx 传递的参数方式:
立即学习“PHP免费学习笔记(深入)”;
- 确认
config/app.php中已开启路由:'url_route_on' => true - ThinkPHP 6/7 默认依赖
s=参数传入路由路径,无需开启 PATH_INFO;保持'url_pathinfo_convert' => false(或注释掉)更稳妥 - 新版默认已启用 URL 重写逻辑,一般无需手动改
url_model;若显式设置,url_model = 2(REWRITE 模式)即可 - 确保
public/.htaccess存在仅作参考,Nginx 不读取它,删不删都不影响
验证与排错要点
配置完成后,务必逐项验证:
- 执行
nginx -t检查语法,再systemctl reload nginx生效 - 访问一个带路由的地址(如
/index/hello),确认不出现index.php且页面正常 - 打开浏览器开发者工具 → Network 标签,检查 CSS/JS 图片等静态资源是否返回 200(说明
root和静态匹配无误) - 若刷新页面 404,大概率是主
location /缺少try_files或写错参数;若点链接正常但刷新 404,说明前端路由(如 Vue Router history 模式)未配合后端 fallback,需额外加try_files $uri $uri/ /index.php?s=$uri&$args; - 清除浏览器缓存,尤其避免旧的 301 重定向干扰判断



















