thinkphp路由不生效主因是服务器配置问题:apache需开启allowoverride all,nginx须正确配置root指向public目录、fastcgi_param script_filename及ssl下完整复制location规则,并防范opcache导致的$_server变量污染。

ThinkPHP 路由不生效?检查 public/.htaccess 是否启用
宝塔面板默认关闭 Apache 的 AllowOverride,导致 ThinkPHP 的伪静态规则被忽略,访问域名直接 404 或跳转到根目录首页。这不是代码问题,是服务器配置没开。
- 在宝塔「网站」→ 选中站点 → 「设置」→ 「配置文件」,找到
<directory></directory>区块 - 确认里面有
AllowOverride All(不是None) - Apache 需重启生效;若用 Nginx,则必须手动配置 ThinkPHP 伪静态规则,不能依赖
.htaccess - 常见错误现象:
http://domain.com/index.php/index/index可访问,但http://domain.com/index/index报 404
Nginx 下 ThinkPHP 多站点入口路径写错,SCRIPT_FILENAME 会指向错误位置
宝塔新建站点时,「根目录」填的是整个 ThinkPHP 项目路径(如 /www/wwwroot/myapp),但实际入口是 /public 子目录。Nginx 若没重写 fastcgi_script_name,PHP 就找不到 index.php。
- 进站点「配置文件」,把原生的
root改成指向public目录:root /www/wwwroot/myapp/public; - 同时确保
location ~ \.php(.*)$块内有:fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; - 漏掉这行或
$document_root指向父目录,就会报错:Primary script unknown - 不要用
alias替代root,ThinkPHP 的 PATH_INFO 依赖正确解析SCRIPT_NAME
多个 ThinkPHP 站点共用一个 PHP 版本时,$_SERVER['DOCUMENT_ROOT'] 可能污染
某些共享环境(尤其开启 OPcache 或 FastCGI 进程复用)下,不同站点的 $_SERVER 变量可能残留上一个请求的值,导致 think\facade\App::getRootPath() 返回错误路径,路由、模板、日志全乱。
- 在每个站点的
public/index.php开头强制重置关键路径:$_SERVER['DOCUMENT_ROOT'] = dirname(__DIR__) . '/public';
- 更稳妥的做法:在
config/app.php中显式指定:'root_path' => dirname(__DIR__) . '/', - 该问题在宝塔「PHP 管理」→「配置修改」里开启
opcache.enable=0可临时验证是否为缓存干扰 - 不处理的话,可能出现:A 站点正常,B 站点加载 A 的视图文件,或日志写入错目录
绑定域名后 HTTPS 访问报 ERR_SSL_PROTOCOL_ERROR?检查宝塔 SSL 配置是否覆盖了子目录规则
给 ThinkPHP 站点单独开启 SSL 后,Nginx 的 listen 443 ssl 块如果没包含完整的 location 配置,会导致 PHP-FPM 请求被当作静态文件处理,或根本无法转发。
- 进站点「SSL」→ 开启并强制 HTTPS 后,务必点击「配置文件」,确认 443 server 块里完整复制了 80 端口下的所有
location ~ \.php和location /规则 - 特别注意:宝塔有时会漏掉
include enable-php-*.conf;这一行,导致 PHP 解析失效 - 错误现象:HTTP 正常,HTTPS 打开空白页且 Network 显示状态码 200(实为返回了 index.php 源码)
- 验证方式:curl -I https://your-domain.com,看响应头是否有
X-Powered-By: PHP
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











