You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

D8多站点无法读取正确子文件夹数据库凭据,仅使用默认配置

Drupal 8 多语言子站迁移到新域名后配置加载异常的解决指南

首先得说,你遇到的这个问题在Drupal多站点+多语言的迁移场景里挺常见的,尤其是从域名多站点转路径多站点的时候,很容易踩配置匹配的坑。我帮你一步步排查解决:

先揪出最明显的错误:sites.php的匹配规则写错了!

你现在的sites.php里写的是'something.dev.da' => 'da',这是把da当成子域名来匹配的,但你的需求是something.dev/da这种路径前缀的子站,完全不对路子!

Drupal 8要支持路径式多站点,得自己写匹配逻辑,替换成下面的代码试试:

<?php
// 拆分请求路径,拿到第一个前缀(da/ru)
$request_path = trim($_SERVER['REQUEST_URI'], '/');
$site_prefix = explode('/', $request_path)[0] ?? '';

// 针对something.dev域名的路径子站做匹配
if ($_SERVER['HTTP_HOST'] === 'something.dev') {
  if ($site_prefix === 'da') {
    $sites['something.dev/da'] = 'da';
  } elseif ($site_prefix === 'ru') {
    $sites['something.dev/ru'] = 'ru';
  } else {
    // 默认站点
    $sites['something.dev'] = 'default';
  }
}

这个逻辑会先判断主机名是something.dev,再根据路径前缀分配对应的站点目录,这才是符合你需求的配置。

然后检查软链接与Web服务器配置

根目录的da、ru软链接指向./是对的,这是Drupal路径多站点共享核心的标准操作,但要确保:

  • 软链接的权限正确:执行chown -R www-data:www-data da ru(把www-data换成你的Web服务器用户,比如apache),确保服务器能读取软链接;
  • Web服务器允许跟随软链接:
    • Apache:虚拟主机配置里要加Options FollowSymLinks;
    • Nginx:如果开了open_file_cache,要加disable_symlinks off;,避免软链接被拦截。

重建软链接的时候,直接在站点根目录执行ln -s . da和ln -s . ru就行,别搞复杂了。

一定要清缓存!Drupal的缓存是出了名的顽固

不管你改了什么配置,第一步先清缓存,不然都是白搭:

  • 手动清:删除sites/default/files/cache、sites/da/files/cache、sites/ru/files/cache这些目录下的所有文件;
  • 用Drush的话更方便:
drush cr -l something.dev/da
drush cr -l something.dev/ru
drush cr -l something.dev

如果子站连Drush都连不上,就手动删缓存目录,绝对要做这一步!

检查数据库与配置文件里的旧残留

你说清理了旧URL,但可能漏了关键配置:

  1. 数据库里的key_value表,找system.site这条记录,把里面的siteurl改成https://something.dev(如果是共享数据库,还要确认语言路径前缀配置正确);
  2. 每个站点目录下的files/config_xxxx文件夹里的配置文件,比如system.site.yml,里面的name和siteurl要对应新域名;
  3. 确认sites/da/settings.php和sites/ru/settings.php里的数据库配置正确:如果是共享数据库,确保多语言配置已开启;如果是单独数据库,确认$databases指向正确的库。

最后测试:强制站点匹配来排查

如果上面都没用,就在index.php开头加一段临时代码,强制Drupal加载对应站点,看看是不是匹配逻辑的问题:

<?php
// 临时测试用,用完记得删掉!
$_SERVER['HTTP_HOST'] = 'something.dev';
$path = explode('/', trim($_SERVER['REQUEST_URI'], '/'));
if (!empty($path[0]) && in_array($path[0], ['da', 'ru'])) {
  $_SERVER['SITE_NAME'] = $path[0];
}
// 下面是原来的index.php代码
...

如果这样能加载sites/da的配置,那说明要么是sites.php的逻辑有问题,要么是Web服务器没正确传递REQUEST_URI变量(比如Apache的mod_rewrite配置有问题)。


内容的提问来源于stack exchange,提问作者Christian Thomsen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:44:33