ThinkPHP 5.0.24伪静态规则写在application/route.php中,以数组形式定义,含__pattern__和路由映射,依赖url_route_on开启,需配合服务器兜底转发至index.php,并通过url()函数生成链接才能生效。

伪静态配置在 application/route.php 文件里
ThinkPHP 5.0.24 的伪静态规则不写在 Nginx 或 Apache 配置中,而是由框架自身通过 route.php 解析并匹配。你看到的 /news/123.html 这类地址,实际是框架把请求转发给对应控制器,并非服务器重写后的物理路径。
该文件位于 application/route.php,返回一个数组,其中包含 '__pattern__' 和具体路由映射规则。例如:
return [
'__pattern__' => [
'aid' => '(\d+)',
],
'news/<aid>.html' => ['home/News/read', ['method' => 'get']],
];
注意:这种写法依赖 url_route_on 配置开启(默认开启),且要求入口文件未被隐藏——否则 public/index.php/news/123.html 才能命中。
URL 生成时必须用 url() 函数,不能手拼
伪静态生效的前提是:所有链接都通过 url() 助手函数生成。比如你在模板里写 {:url('home/News/read', ['aid' => 123])},才会输出 /news/123.html;如果直接写死 /news/123.html,后续改规则时所有地方都要手动同步。
立即学习“PHP免费学习笔记(深入)”;
常见错误现象:
- 页面能访问,但点击链接跳转 404 —— 检查是否漏了
url()调用 - 生成的 URL 是
/index.php/news/123.html—— 确认 Nginx/Apache 已正确配置隐藏入口文件(如 Nginx 的try_files $uri $uri/ /index.php?$query_string;) - 带参数的伪静态地址无法匹配 —— 检查
'__pattern__'中正则是否覆盖了实际值(比如[\-\w]+不匹配中文或斜杠)
rewrite 规则只是辅助,不是伪静态主体
很多人误以为伪静态靠服务器 rewrite 实现,其实 TP5.0.24 是“先由 Web 服务器把请求兜底给 index.php,再由框架内部解析 URL 路径”。所以 Nginx 的 rewrite 只做两件事:
- 把所有非静态资源请求转给
index.php - 屏蔽敏感路径(如
/runtime/)防止日志泄露
典型 Nginx 配置片段(必须有):
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ ^/runtime/.*\.(log|php)$ {
deny all;
}
少第一条,url() 生成的地址就带 index.php;少第二条,攻击者可能直接下载 /runtime/log/202608/xxxx.log。
调试伪静态失败,优先检查这三处
伪静态不生效,90% 是以下三个位置之一出问题:
-
app.php中'url_route_on' => true是否被设为false或注释掉 -
route.php返回的数组里,键名是否用了单引号导致变量未解析(应写'news/<aid>.html',而非"news/$aid.html") - 路由规则顺序错乱:更具体的规则(如
'user/<id>/profile')必须放在更宽泛的规则(如'user/<name>')之前,否则后者会提前匹配
别在 .htaccess 或 Nginx 的 location ~ \.html$ 块里折腾重写逻辑——TP5.0.24 不走那条路。它只认 route.php 里定义的模式,其余全是干扰项。



















