thinkphp5.0伪静态必须服务器规则与框架配置双向对齐:apache下.htaccess须与index.php同级,含rewritecond判断非真实文件/目录及rewriterule ^(.*)$ index.php/$1 [qsa,pt,l];框架需设url_route_on=>true、pathinfo_depr=>'/’、url_html_suffix=>'',缺一即404。

ThinkPHP5.0 伪静态必须服务器规则 + 框架配置双向对齐,缺一不可;只改 .htaccess 或只开 url_route_on 都会 404。
Apache 下 .htaccess 规则怎么写才不 404
TP5.0 默认入口是项目根目录下的 index.php,.htaccess 必须和它放同一级,且内容不能照搬其他框架模板。
- 确认 Apache 已启用
mod_rewrite:执行sudo a2enmod rewrite并重启服务 - 检查虚拟主机配置中
AllowOverride是否为FileInfo Options(不是None) -
.htaccess内容必须包含RewriteCond判断非真实文件/目录,否则静态资源(如css、js)也会被转发到index.php - 标准写法(放在与
index.php同级):RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] - 若部署在子目录(如
/myapp/),需加RewriteBase /myapp/
config/app.php 里哪几项必须设对
框架层不配合,服务器转发过去也白搭。TP5.0 默认不开启路由,URL_MODEL=1 是普通模式,根本不用 PATH_INFO,所以必须手动打开。
-
'url_route_on' => true:必须开启,否则所有请求走默认控制器 -
'pathinfo_depr' => '/':必须为斜杠,和.htaccess中的index.php/$1对应;设成-或.会导致路由解析失败 -
'url_html_suffix' => '':设为空字符串才能支持/user/list这类无后缀 URL;设成html就只能访问/user/list.html - 不要动
URL_MODEL:TP5.0 不再用这个常量控制模式,靠pathinfo_depr+ 路由开关协同判断
Nginx 下为什么 try_files 规则总报 404
Nginx 不读 .htaccess,必须改站点配置;但 TP5.0 对 PATH_INFO 解析依赖 index.php?s=xxx 格式,try_files 默认拼的是 /index.php?s=$uri&$args,看似对,实则有坑。
- 规则必须写在
location / { }块内,且root指向必须是项目根目录(含index.php),不是public/(TP5.0 没public入口约定) - 推荐写法(避免
if性能陷阱,又兼容 TP5.0):location / { try_files $uri $uri/ /index.php?s=$uri&$args; } - 如果用了宝塔或小皮面板,选“ThinkPHP”伪静态模板即可,但务必确认它生成的是上面这行,而不是 Laravel 风格的
/index.php?$query_string - 验证顺序:先测
/index.php?s=index/index→ 再测/index/index;前者失败说明 PHP 或框架配置错,后者失败才查 Nginx
多应用或子目录部署时最易忽略的点
TP5.0 多应用靠 URL 第一段识别应用名(如 /admin/index 中的 admin),一旦路径截断或 PATH_INFO 为空,直接进错应用或 404。
- 子目录部署(如
https://a.com/myapp/):Nginx 规则中的$uri会带前缀,但s=$uri会把/myapp/index/index当作完整路由传入,框架无法识别应用 —— 此时需用rewrite显式剥离前缀:location /myapp/ { rewrite ^/myapp/(.*)$ /$1 last; } location / { try_files $uri $uri/ /index.php?s=$uri&$args; } - 多应用下 Apache 的
.htaccess无需额外改动,但确保没把请求误导向其他入口;重点检查index.php是否真在根目录,而非public/下(TP5.0 不走public) - 错误日志里出现
Primary script unknown,大概率是root路径配错,或fastcgi_param SCRIPT_FILENAME拼错了绝对路径
真正卡住人的从来不是某一行代码,而是服务器转发路径、框架解析逻辑、实际部署结构这三者之间那一点没对齐——比如 .htaccess 放错了目录层级,或 Nginx 的 root 指向了 public 却还按 TP5.0 默认入口去配规则。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











