TP5 怎么配置 URL 伪静态规则支持 Nginx 服务器

文章导读
在 Nginx 服务器上运行 ThinkPHP 5 项目,核心是在配置文件的 location 块中添加重写规则,将不存在文件的请求转发给 index.php 处理,同时必须确保 PHP 解析规则正确配置。
📋 目录
  1. 完整配置示例(推荐)
  2. 传统方案对比(兼容性问题)
  3. 配置原理
  4. 操作步骤
  5. 验证方法
  6. 常见坑
A A

在 Nginx 服务器上运行 ThinkPHP 5 项目,核心是在配置文件的 location 块中添加重写规则,将不存在文件的请求转发给 index.php 处理,同时必须确保 PHP 解析规则正确配置。

先说结论:Nginx 不支持 .htaccess 文件,必须在 server 配置中手动添加 rewrite 规则才能实现 TP5 伪静态,且需配合 PHP-FPM 配置。

  • 适合:使用 Nginx 作为 Web 服务器的 ThinkPHP 5 及以上版本项目。
  • 先准备:确保拥有 nginx.conf 或 vhosts 配置文件的编辑权限,并确认项目根目录指向 public 文件夹。
  • 验收:访问不含 index.php 的控制器 URL,确认页面正常加载且无 404 错误,PHP 代码能正常执行。

完整配置示例(推荐)

以下是包含 PHP 解析处理的完整 server 配置示例。相比传统的 if 指令,推荐使用 try_files 以提升性能并降低逻辑隐患。

server {
    listen 80;
    server_name example.com;
    # 根目录必须指向 public
    root /www/wwwroot/your_project/public;
    index index.php index.html;

    location / {
        # 推荐方案:try_files 性能优于 if
        try_files $uri $uri/ /index.php?$query_string;
    }

    # 必须配置 PHP 解析,否则 PHP 代码无法执行
    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

如果是宝塔面板用户,可在网站设置中找到“伪静态”选项,选择 ThinkPHP 5 规则,但建议检查是否包含上述 PHP 解析配置。

传统方案对比(兼容性问题)

部分旧版 TP5 项目可能依赖 pathinfo 模式,若 try_files 方案导致参数获取异常,可改用以下传统 rewrite 规则,但需注意 if 指令的性能损耗:

location / {
    if (!-e $request_filename) {
        rewrite ^(.*)$ /index.php?s=$1 last;
        break;
    }
}

注意:使用传统方案时,通过 input() 获取参数可能会多出一个 s 参数,需在代码中过滤。

配置原理

ThinkPHP 5 采用单入口模式,所有请求理论上都应由 index.php 接收并路由。Apache 服务器通常通过 .htaccess 文件自动处理重写,但 Nginx 不会读取该文件,必须在主配置或虚拟主机配置中明确定义重写逻辑。如果不配置,访问类似 /module/controller/action 的链接时,Nginx 会直接查找对应目录文件,找不到则报 404 错误。

操作步骤

1. 确认项目根目录

TP5 怎么配置 URL 伪静态规则支持 Nginx 服务器

TP5+ 版本的安全规范要求网站运行目录指向 public 子目录。在 Nginx 配置中,root 路径应结束于 /public,例如 root /www/wwwroot/your_project/public;。

2. 编辑配置文件

根据服务器环境选择修改位置:

  • 手动配置:打开 nginx.conf 或 vhosts.conf,找到对应 server 块,替换 location / 和 location ~ \.php$ 部分。
  • 宝塔面板:进入网站管理 > 设置 > 伪静态,下拉选择 ThinkPHP 5 或手动粘贴代码后保存。

3. 重载 Nginx

修改配置后需重载服务生效。命令行执行 nginx -s reload,或在宝塔面板点击“重载配置”。

验证方法

配置完成后,尝试访问一个不包含 index.php 的 URL,例如 http://你的域名/admin/user/index。如果页面正常显示且地址栏没有自动跳回 index.php,说明规则生效。同时检查浏览器控制台网络标签,确认请求状态码为 200 而非 404。

此外,创建一个包含 phpinfo() 的测试文件,确认 PHP 解析引擎正常工作,排除仅配置了伪静态但未配置 PHP 解析的情况。

常见坑

1. 参数多出一个 s

TP5 怎么配置 URL 伪静态规则支持 Nginx 服务器

部分 TP5 版本在使用传统 rewrite 规则后,通过 input() 或 $this->request->param() 获取参数时可能会多出一个 s 参数,这是因为规则中传递了 ?s=$1。如果在代码中获取参数异常,需检查是否受此影响并手动过滤。

2. 根目录配置错误

若 root 指向项目根目录而非 public 目录,可能导致静态资源路径错误或安全隐患。务必确认 root 路径末尾包含 /public。

3. 缺少 PHP 解析配置

仅配置伪静态规则而忽略 location ~ \.php$ 块,会导致访问 index.php 时直接下载文件而非执行代码。务必确保 fastcgi_pass 指向正确的 PHP-FPM 地址。

4. 宝塔自动检测失败

宝塔面板有时无法自动识别 TP 版本,若预设规则无效,请手动粘贴标准 rewrite 代码而非依赖自动检测。