TYPO3 v9 Route Enhancers mit Suffix '.html'

Standardmäßig generiert TYPO3 9 LTS URLs ohne die Endung .html.

Sofern aber vor dem Upgrade URLs mit .html verwendet wurden, kann es sinnvoll sein, dies auch in TYPO3 9 anzupassen. Schließlich sind die "alten" URLs auch schon im Index diverser Suchmaschinen verzeichnet.

Wird nun folgender Code in der Custom.yaml ergänzt

PageTypeSuffix:
 type: PageType
 default: .html

führt dies nun allerdings derzeit noch zu dem Problem, dass die Rootpage nur noch über example.com/index.html aufgerufen werden kann.

Wie kann man es erreichen das Webseiten nach einem TYPO3 Update auf TYPO3 mit dem neuen Routing weiterhin mit der Endung '.html' ausgegeben werden, aber die Rootpage korrekt ohne Endung?

Das auf forge.typo3.org gemeldete Problem ist aktuell noch offen (Stand September 2019).

Zur Zeit kann man einen custom PageType decorator bereitstellen, der das gewünschte Ergebnis erzielt. Der Entwickler, der das Problem gemeldet hat, hat den Quellcode hierfür freundlicherweise bereitgestellt:

In einem eigenen Sitepackage wird folgender Code ergänzt:

/Classes/Routing/CustomPageTypeDecorator.php

<?php

namespace Brand\SitepackageName\Routing;

use TYPO3\CMS\Core\Routing\Enhancer\PageTypeDecorator;
use TYPO3\CMS\Core\Routing\RouteCollection;
/**
 * CustomPageTypeDecorator
 */
class CustomPageTypeDecorator extends PageTypeDecorator
{
    public const IGNORE_INDEX = [
        '/index.html',
        '/index/',
    ];
    public const ROUTE_PATH_DELIMITERS = ['.', '-', '_', '/'];
    /**
     * @param \TYPO3\CMS\Core\Routing\RouteCollection $collection
     * @param array $parameters
     */
    public function decorateForGeneration(RouteCollection $collection, array $parameters): void
    {
        parent::decorateForGeneration($collection, $parameters);
        /**
         * @var string $routeName
         * @var \TYPO3\CMS\Core\Routing\Route $route
         */
        foreach ($collection->all() as $routeName => $route) {
            $path = $route->getPath();
            if (true === \in_array($path, self::IGNORE_INDEX, true)) {
                $route->setPath('/');
            }
        }
    }
}

ext_localconf.php

/**
 * Add custom PageTypeDecorator
 */
$GLOBALS['TYPO3_CONF_VARS']['SYS']['routing']['enhancers']['CustomPageType'] = \Brand\SitepackageName\Routing\CustomPageTypeDecorator::class;

Passen Sie den PHP namespace (\Brand\SitepackageName\) bei beiden Daten oberhalb an.

Ergänzen Sie nun folgenden Code in Ihrer Sites Konfiguration:

config.yaml

PageTypeSuffix:
  type: CustomPageType
  default: '.html'
  index: 'index'
  map:
    '.html': 0

Nun sollten die Seiten wieder korrekt ausgegeben werden:

www.example.com
-- www.example.com/site1.html
-- www.example.com/site2.html