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;,避免软链接被拦截。
- Apache:虚拟主机配置里要加
重建软链接的时候,直接在站点根目录执行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,但可能漏了关键配置:
- 数据库里的
key_value表,找system.site这条记录,把里面的siteurl改成https://something.dev(如果是共享数据库,还要确认语言路径前缀配置正确); - 每个站点目录下的
files/config_xxxx文件夹里的配置文件,比如system.site.yml,里面的name和siteurl要对应新域名; - 确认
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
相关产品推荐
相关产品推荐

