thinkphp伪静态不生效,主因是服务器重写规则与框架path_info路由未对齐:需确保nginx/apache正确传递原始路径至index.php,且url_route_on开启、运行目录和伪静态规则(如try_files $uri $uri/ /index.php?s=$uri&$args)匹配tp6解析逻辑。

ThinkPHP 伪静态配置不生效,八成是服务器重写规则和框架路由没对齐;单元测试里多语言切换失败,基本是因为语言包加载时机或 Lang 类实例状态没清理干净。
Apache 下 .htaccess 规则写错导致 404 或跳转到首页
常见错误是把 index.php/$1 写成 index.php?s=$1,或者漏掉 QSA,PT,L 标志。TP5/6 默认用 PATH_INFO 模式解析 URL,必须让重写后请求能进到 index.php 并保留原始路径段。
-
RewriteCond %{REQUEST_FILENAME} !-d和!-f缺一不可,否则静态资源(如 CSS、JS)会被错误转发 - 确保 Apache 已启用
mod_rewrite,且对应目录的AllowOverride设为FileInfo Options,不是All也能行,但None必然失效 - 如果项目部署在子目录(比如
http://site.com/app/),.htaccess要加RewriteBase /app/,否则$1会丢掉前缀
Nginx 的 try_files 和 if 判断逻辑容易踩坑
if (!-e $request_filename) 在 Nginx 中属于“慢路径”,且在某些版本中与 try_files 混用会导致重复匹配;更稳妥的是只用 try_files,但参数顺序不能错。
- 推荐写法:
try_files $uri $uri/ /index.php?s=$uri&$args—— 注意&是 HTML 实体,在配置文件里要写成&,否则 PHP 接收不到完整查询参数 - 不要在
location /外再套一层location ~ \.php$来处理 PHP,否则重写后的请求可能进不了 FastCGI 块 - TP6 默认使用
pathinfo_depr => '/',所以 Nginx 规则里必须传s=$uri,而不是s=/$uri,否则路由解析会多出一个空段
ThinkPHP 路由开关和 URL 后缀配置不匹配
开了伪静态但访问 /user/login.html 报 404?检查三个地方:url_route_on 是否为 true、url_html_suffix 是否设了 .html、路由定义里有没有显式匹配该后缀。
-
url_html_suffix只影响生成 URL(如url('user/login')输出带.html),不影响解析;解析靠路由规则本身是否覆盖该路径 - 若用闭包定义路由,需手动加后缀匹配:
Route::get('article/<id>.html', 'index/article/read');</id> - TP6+ 不再支持
URL_MODEL配置项,别在app.php里写它,无效还报错
多语言单元测试里 Lang::setLocale() 不生效
测试中调用 Lang::setLocale('zh-cn') 后,lang('hello') 还返回英文?因为 Lang 类内部缓存了语言包内容,且单例状态在测试用例间未重置。
- 每个测试方法开头加
Lang::clear();,清空已加载的语言包和当前 locale - 确保语言包文件存在且命名正确:
lang/zh-cn.php,键名小写,无 BOM;TP6 要求语言包返回数组,不能有 echo 或输出 - 避免在
setUp()里全局设 locale,应按测试用例单独设,否则上一个测试污染下一个
真正卡住的地方往往不在规则本身,而在「重写是否真触发了」——开 Nginx error log 级别为 notice,或 Apache 的 RewriteLog(2.4+ 改用 RewriteLogLevel),看请求到底被哪条规则捕获、转发到了哪里。没日志,等于蒙眼调配置。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











