核心是Nginx将所有非静态请求通过try_files转发至public/index.php,需配置location /和location ~.php$双区块、root指向public、SCRIPT_FILENAME路径正确,并确保ThinkPHP路由已开启。

要让 ThinkPHP 在 Nginx 下隐藏 index.php,核心是正确配置 Nginx 的重写规则,使所有非静态资源请求都转发给 index.php 入口文件处理,同时避免直接暴露该文件路径。
确保 ThinkPHP 开启 URL 重写模式
在 ThinkPHP 项目中,需确认已启用 PATH_INFO 或兼容模式(推荐使用 pathinfo 模式):
- 检查
config/app.php中'url_model' => 2(PATHINFO 模式)或'url_convert' => true(新版默认已开启) - 确认
public/.htaccess文件存在(仅作参考,Nginx 不读取它) - 确保
public/index.php是唯一入口,且未被 Nginx 直接禁止访问
Nginx 配置关键 rewrite 规则
在对应站点的 server 块中,添加或修改 location 区块。以下为推荐配置(适配 ThinkPHP 6/7 和大多数 5.x 版本):
location / {
try_files $uri $uri/ /index.php?$query_string;
}
<p>location ~ .php$ {
fastcgi_pass 127.0.0.1:9000; # 或 unix:/var/run/php/php8.1-fpm.sock
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}注意:不要在 PHP location 块中加额外的 rewrite,否则会导致 PATH_INFO 解析异常;try_files 已足够安全可靠。
立即学习“PHP免费学习笔记(深入)”;
验证静态资源是否正常访问
隐藏 index.php 后,CSS、JS、图片等静态文件必须能直接访问,否则页面会错乱:
- 确保
public/是 Nginx 的 root 目录(例如root /var/www/myapp/public;) - 检查浏览器开发者工具 Network 标签,确认
/static/css/app.css等路径返回 200 而非 404 或 500 - 若出现 404,请核对文件实际路径与 Nginx root + 请求 URI 是否匹配
可选:强制 HTTPS 与去除 www(增强 SEO)
如需进一步优化,可在同一 server 块中补充:
# 强制 HTTPS
if ($scheme != "https") {
return 301 https://$server_name$request_uri;
}
<h1>去除 www(可选)</h1><p>if ($host ~ ^www.(.+)$) {
return 301 <a href="https://www.php.cn/link/ac9b8c0893880e322ad0e10e0fd41163">https://www.php.cn/link/ac9b8c0893880e322ad0e10e0fd41163</a>;
}但更推荐用单独的 server 块做 301 跳转,避免 if 指令潜在风险。
配置完成后,执行 nginx -t 测试语法,再 systemctl reload nginx 生效。访问 https://yoursite.com/index/index 应正常显示,而非提示 404 或跳转到含 index.php 的 URL。



















