ThinkPHP 怎么配置 Nginx 伪静态规则避免 404?

文章导读
ThinkPHP 项目部署到 Nginx 时,需要在 server 配置块的 location / 中添加 try_files 规则,将请求重定向到 index.php 入口文件。此方法适用于 ThinkPHP 5、6 及 8 版本,风险在于规则错误可能导致静态资源无法加载或路径泄露。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

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)有读取权限。

ThinkPHP 怎么配置 Nginx 伪静态规则避免 404?

怎么验证是否生效

使用 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