thinkphp nginx伪静态核心是用try_files $uri $uri/ /index.php?$query_string;将请求交由index.php处理,并确保fastcgi_param path_info $fastcgi_path_info;和cgi.fix_pathinfo=1配合正确传递路由信息。

调试 ThinkPHP 的伪静态重写规则在 Nginx 上,核心是确认 try_files 是否正确将请求交由 index.php 处理,并确保 PATH_INFO 能被 PHP 正确解析。Nginx 本身不支持 Apache 风格的 .htaccess,所有重写逻辑必须显式写在 server 块中,且需配合 FastCGI 参数传递。
确认 ThinkPHP 路由模式与 Nginx 配置匹配
ThinkPHP 默认使用 PATH_INFO 模式(如 /index.php/user/login),也可开启兼容模式(/user/login)。若启用“强制伪静态”,需 Nginx 将所有非资源请求重写到 index.php,同时保留原始 URI 供 PHP 解析。
- 检查
config/app.php中'url_model' => 2(PATH_INFO)或1(兼容模式),不同模式对应不同 Nginx 写法 - 推荐统一用 PATH_INFO 模式(更稳定),此时 Nginx 不需要重写 URL,只需保证
index.php/xxx能被正确路由 - 若用兼容模式(即隐藏
index.php),才需 Nginx 重写 —— 这也是最常出问题的场景
标准兼容模式重写配置(隐藏 index.php)
以下为适用于 ThinkPHP 5/6 的常用 server 配置片段,放在 location / 块内:
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
}
}
⚠️ 注意:Nginx 官方不推荐在 location 中使用 if,生产环境建议改用 try_files 更安全:
location / {
try_files $uri $uri/ /index.php?s=$uri&$args;
}
-
$uri匹配真实文件(如 CSS、JS、图片),存在则直接返回 -
$uri/匹配目录,触发自动索引或 403 - 都不匹配时,转发给
index.php?s=原始路径,ThinkPHP 通过$_GET['s']解析路由 -
&$args保留原有查询参数(如?page=2&sort=id)
关键 FastCGI 参数不能遗漏
仅重写不够,PHP-FPM 必须能拿到正确的 PATH_INFO 或 QUERY_STRING。常见错误是 SCRIPT_FILENAME 正确但 PATH_INFO 为空,导致路由解析失败。
在 location ~ \.php$ 块中,务必包含:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param QUERY_STRING $query_string;
并确保启用 PATH_INFO 支持(尤其 PHP 7.4+ 默认禁用):
- 在
php.ini中确认cgi.fix_pathinfo=1(开发可开,生产建议设为 0 并靠 Nginx 显式传参) - 更稳妥做法:Nginx 显式设置
fastcgi_param PATH_INFO,避免依赖fix_pathinfo - ThinkPHP 6+ 推荐用
swoole或apache mod_rewrite以外方式部署,但 Nginx 下仍以try_files + QUERY_STRING最可靠
快速验证与排错方法
不用重启 Nginx,也能快速定位问题:
- 访问
/index.php?m=user&a=login—— 若能正常打开,说明 PHP 和框架基础运行正常,问题在重写层 - 访问
/user/login返回 404?检查try_files是否命中/index.php?s=...,可用error_log加日志:log_not_found on; - 访问成功但提示“找不到控制器”?查看
$_GET['s']是否为空或格式错误,在index.php开头加var_dump($_GET); die;确认 - 用
curl -I http://your.site/user/login查看响应头状态码和重定向链,排除 301 循环
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











