WEBcoast Logo

Mehrere Domains im selben Seitenbaum/Site

Der Kunde wollte gerne eine Markentrennung durchführen. Dabei sollten allerdings 99% der Inhalte gleich bleiben. Die technische Lösung sah vor, dass der gleiche Seitenbaum bzw. die gleiche Site aus der Site Configuration über zwei unterschiedliche Domains ausgeliefert wird. Für einzelne Seiten und Inhalte sollte dann eingestellt werden, ob diese nur für eine der Marken angezeigt werden soll. Nach ein wenig Recherche und Ausprobieren ist folgende Lösung dabei heraus gekommen.

Es ist tatsächlich möglich, Umgebungsvariablen in der Base-URL der Sites zu verwenden:

base: 'https://%env(TYPO3_BRAND_VARIANT)%.de/'
baseVariants:
  -
    base: 'https://stage.%env(TYPO3_BRAND_VARIANT)%.de/'
    condition: 'applicationContext == "Production/Staging"'
  -
    base: 'https://dev.%env(TYPO3_BRAND_VARIANT)%.de/'
    condition: 'applicationContext == "Production/Dev"'
  -
    base: 'https://%env(TYPO3_BRAND_VARIANT)%.ddev.site/'
    condition: 'applicationContext == "Development"'

Über die `public/.htaccess` habe ich dann die Umgebungsvariable abhängig vom Hostname gesetzt.

SetEnvIf Host "(?:(?:stage|dev)\.)?one-brand\.(?:de|ddev\.site)$" TYPO3_BRAND_VARIANT=one-brand
SetEnvIf Host "(?:(?:stage|dev)\.)?the-other\.(?:de|ddev\.site)$" TYPO3_BRAND_VARIANT=the-other

Soweit so gut. Das Problem war nur, dass TYPO3 die generierte Site Configuration cached und zwar nachdem die Umgebungsvariablen ersetzt wurden. Das führte dazu, dass ich immer nur der Marken-Domains aufrufen konnte, nachdem der Cache gelöscht wurde. Die zweite Domain lieferte dann nur noch einen 404. Um das zu lösen, musste ich TYPO3's XCLASS-Mechanismus nutzen und die `SiteConfiguration` Klasse überschreiben.

// Override the SiteConfiguration class
$GLOBALS['TYPO3_CONF_VARS']['SYS']['Objects'][\TYPO3\CMS\Core\Configuration\SiteConfiguration::class] = [
    'className' => \MyVendor\Sitepackage\Configuration\SiteConfiguration::class,
];

In meiner eigenen `SiteConfiguration` Klasse habe ich dann einfach nur die gehashte Umgebungsvariable angehängt.

<?php

declare(strict_types=1);

namespace MyVendor\Sitepackage\Configuration;

use TYPO3\CMS\Core\Cache\Frontend\PhpFrontend;

class SiteConfiguration extends \TYPO3\CMS\Core\Configuration\SiteConfiguration
{
    public function __construct(string $configPath, PhpFrontend $coreCache = null)
    {
        parent::__construct($configPath, $coreCache);
        $this->cacheIdentifier = $this->cacheIdentifier . '-' . md5(getenv('TYPO3_BRAND_VARIANT'));
    }
}

Aber Achtung: Die `SiteConfiguration` Klasse ist als `@internal` markiert und könnte sich ohne Warnung ändern.

Die Beispiele dürfen gerne frei verwendet werden. Lasst mich gerne über einen Kommentar wissen, was ihr von der Lösung haltet.