ThinkPHP 项目部署到 Nginx 时,需要在 server 配置块的 location / 中添加 try_files 规则,将请求重定向到 index.php 入口文件。此方法适用于 ThinkPHP 5、6 及 8 版本,风险在于规则错误可能导致静态资源无法加载或路径泄露。
先说结论:配置 Nginx 伪静态的核心是将不存在文件的请求交给 index.php 处理,而不是直接返回 404。
- 适合:ThinkPHP 5 及以上版本部署在 Nginx 环境
- 先准备:确认网站根目录指向 public 文件夹,备份原有 Nginx 配置
- 验收:访问非首页路由正常加载,静态资源无 404 报错
命令速用版
在 Nginx 配置文件的 server 块中,找到或添加 location / 段落,直接使用以下配置片段:
location / {
try_files $uri $uri/ /index.php?$query_string;
}如果使用的是 ThinkPHP 6 且开启了多应用模式,确保根目录指向项目下的 public 文件夹,而非项目根目录。
为什么会这样
ThinkPHP 采用单入口机制,所有动态请求实际都由 index.php 接收并分发。Nginx 默认只处理真实存在的静态文件,遇到路由路径会直接报 404。
伪静态规则的作用是告诉 Nginx:如果请求的文件不存在,不要直接报错,而是把请求转交给 index.php,由 ThinkPHP 内部路由系统解析路径。
分步处理
1. 定位配置文件:通常在 /etc/nginx/conf.d/ 或 /etc/nginx/sites-available/ 目录下,找到对应域名的 .conf 文件。
2. 修改 root 路径:确保 root 指令指向 ThinkPHP 项目的 public 目录,例如 root /www/wwwroot/example.com/public;。
3. 插入 rewrite 规则:在 server 块内添加上述 location / 配置,保存文件。
4. 检查语法并重载:执行 nginx -t 检查配置语法,无误后执行 nginx -s reload 生效。
5. 权限检查:确保 public 目录及 index.php 文件对 Nginx 运行用户(如 www-data)有读取权限。
怎么验证是否生效
使用 curl 命令访问一个不存在的物理文件但存在的路由,例如 curl -I http://yourdomain.com/index/test。
如果返回 HTTP/1.1 200 OK,说明伪静态生效;如果返回 404 Not Found,说明规则未命中或路径错误。
同时查看 Nginx 错误日志 /var/log/nginx/error.log,确认没有 permission denied 或 file not found 相关报错。
常见坑
1. 根目录错误:将 Nginx root 指向了项目根目录而非 public 目录,导致 index.php 路径错误或安全风险。
2. 静态资源 404:try_files 规则顺序错误,导致 css/js 文件也被重定向到了 index.php。
3. PATH_INFO 冲突:如果同时开启了 Nginx 的 PATH_INFO 支持,可能与 try_files 规则冲突,建议优先使用 try_files。
常见问题
Apache 的 .htaccess 规则能直接用吗?
不能直接使用。Apache 和 Nginx 配置语法完全不同,需要转换为 Nginx 的 rewrite 或 try_files 规则。
配置后静态文件 css/js 报 404 怎么办?
检查 try_files 顺序,确保 $uri 在前,且 Nginx 能正确识别静态文件 mime 类型。
ThinkPHP 6 多应用模式需要特殊配置吗?
不需要特殊 Nginx 规则,但必须确保 root 指向每个应用独立的 public 目录或统一入口。
参考来源
- ThinkPHP 官方文档 - 部署指南,https://www.thinkphp.cn/doc.html