thinkphp 5.0.21 伪静态生效依赖 web 服务器重写(apache/.htaccess 或 nginx 配置),框架仅解析重写后的 url;需确保 .htaccess 在 public 目录、启用 rewriteengine 和 pt 标志,或 nginx 使用 try_files + s= 参数,并同步配置 url_route_on=>true、url_common=>false、pathinfo_depr=>'/'.

ThinkPHP 5.0.21 的伪静态规则本身不靠改 PHP 代码生效,必须由 Web 服务器(Apache/Nginx)完成重写,框架只负责接收并解析重写后的 URL。直接改 route.php 或 app.php 中的路由配置,不会让 index.php 从 URL 中消失——那是服务器层的事。
Apache 下 .htaccess 规则必须放对位置且带 PT 标志
TP5.0.21 默认使用 PATH_INFO 模式,.htaccess 必须放在 public/ 目录(入口文件所在目录),不是项目根目录。常见错误是放错位置或文件名写成 htaccess(漏掉开头的点)。
-
RewriteEngine On必须启用 -
RewriteCond %{REQUEST_FILENAME} !-d和!-f缺一不可,否则静态资源(如/static/css/app.css)会被错误转发 -
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]中的PT(PassThrough)不能省:没有它,Apache 不会把路径信息正确注入$_SERVER['PATH_INFO'],TP 就收不到路由参数 - 若部署在子目录(如
https://example.com/myapp/),需加RewriteBase /myapp/
Nginx 必须用 try_files 或 if+rewrite,且 PHP 处理块要配对
Nginx 不读 .htaccess,所有规则写在站点 server 块里。TP5.0.21 对 PATH_INFO 支持较弱,推荐用 s= 参数方式(兼容模式),比折腾 fastcgi_split_path_info 更稳。
- 推荐写法(
try_files):location / { try_files $uri $uri/ /index.php?s=$uri&$args; } - 若用
if方式(宝塔常用),注意语法:if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; } - 必须确保
location ~ \.php$ { }块中包含:fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;(不是$document_root),否则index.php找不到自身 - 改完必须执行
nginx -t && nginx -s reload,只改配置不重载等于没改
框架配置要匹配服务器行为,否则 404 或跳首页
服务器转发了请求,但 TP 不认,多半是配置没对齐。TP5.0.21 默认开启路由,但几个关键开关必须显式确认:
-
config/app.php中:'url_route_on' => true(必须) -
'url_common' => false(关闭普通模式,否则即使重写了也 fallback 到?s=解析) -
'pathinfo_depr' => '/'(和 Apache 的index.php/$1或 Nginx 的s=$1保持分隔符一致) - 不要设
'url_html_suffix' => '.html'后就以为能自动加后缀——那只是输出 URL 时追加,不影响路由匹配;真要带.html,得在route.php里写明规则,例如:Route::rule('article/:id.html', 'index/article/read');
最常被忽略的是:Nginx 的 $realpath_root 和 Apache 的 AllowOverride FileInfo Options 这两个底层配置。它们不出问题时一切正常,一出就是 404 或空白页,且日志里几乎不报错——排查时优先盯住这两处。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











