在 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+ 版本的安全规范要求网站运行目录指向 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 版本在使用传统 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 代码而非依赖自动检测。