伪静态未生效,因访问/user/list返回404而/index.php/user/list正常;apache需启用mod_rewrite、.htaccess置于public目录并配标准规则、虚拟主机allowoverride all;nginx需在location /用try_files配合s=$uri&$args,并在php块显式传path_info。

先确认是不是伪静态问题
访问 /user/list 返回 404,但 /index.php/user/list 能正常打开——这就是伪静态没生效的铁证。别急着改 route.php 或调 url_route_on,框架根本没接到请求,查路由文件等于白忙。
Apache 环境下三处必检点
TP5.1 默认入口是 public/index.php,伪静态依赖 .htaccess 和 Apache 配置协同工作:
-
mod_rewrite必须启用:Ubuntu/Debian 执行a2enmod rewrite;Windows 下检查httpd.conf是否取消了#LoadModule rewrite_module modules/mod_rewrite.so的注释 -
.htaccess必须放在public/目录下(和index.php同级),内容用最简版:RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] - 虚拟主机配置中对应
<directory></directory>块里,必须有AllowOverride All(仅FileInfo不够,PT标志需要完整权限)
Nginx 环境下最容易漏掉的两行
TP5.1 仍依赖 PATH_INFO 解析路由,Nginx 默认不传这个值,光写 try_files 不够:
- 在
location /块里加:try_files $uri $uri/ /index.php?s=$uri&$args;(注意是&$args,不是?$query_string,TP5.1 不认后者) - 在
location ~ \.php$块里必须显式加:fastcgi_param PATH_INFO $fastcgi_path_info;,缺了这行,$_SERVER['PATH_INFO']就是空的,路由直接失效 - 确认站点「运行目录」设为
/public(TP5.1 可配,但默认推荐),否则/index.php路径会错位
验证是否真进框架,别信首页能打开
首页能访问 ≠ 伪静态生效。用这几个动作交叉验证:
- 访问一个明显不存在的路径,例如
/xyzabc123:返回 Nginx 原生 404 页面 → 重写没触发;返回 ThinkPHP 的调试页或自定义 404 模板 → 请求已进框架 - 在
public/index.php顶部加:var_dump($_SERVER['PATH_INFO']); die;,再访问/index/index,输出应为/index/index;为空就说明 Nginx/Apache 没把路径信息交过来 - 运行
php think route:list,如果只显示/和/index.php,大概率是入口没接管请求,优先排查服务器配置而非路由定义
PATH_INFO 传递失败、.htaccess 权限被拒、Nginx location 块顺序错位——这些才是 TP5.1 伪静态卡住的高频真实原因,不是框架变复杂了,是环境细节更敏感了。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











