web-dev-qa-db-fra.com

Comment ajouter des URL aux adresses TYPO3 v9?

Lors de la mise à jour de TYPO3 8.7 à TYPO3 9.5, vous pouvez abandonner l'extension realurl au profit de la nouvelle fonctionnalité de routage.

Mais vous remarquerez peut-être que realurl a ajouté un/à toutes les URL par défaut (lorsque vous n'utilisez pas le suffixe html) La fonctionnalité de routage TYPO3 ne le fait pas par défaut et il n'existe actuellement aucune option pour l'activer. Pourquoi est-ce un problème? Dans TYPO3 8.7, vous avez une URL du type www.domain.tld/subpage /. Dans TYPO3 9.5, la même page sera appelée avec l'URL www.domain.tld/subpage . Ainsi, même s'il s'agit de la même page, pour les robots d'exploration de recherche, il s'agit d'une autre URL. TYPO3 effectue une redirection 307 lors de l'appel de l'URL avec un ajout /, mais vous pouvez utiliser votre ancienne structure d'URL.

Comment puis-je enseigner à TYPO3 l'ajout d'un ajout /?

5
Tim Schreiner

Pour toujours ajouter un ajout /, vous pouvez créer vous-même un décorateur d'amélioration d'itinéraire et le placer dans le package de votre site.

Créez un fichier dans le package de votre site sous Classes/Routing/Enhancer/ForceAppendingSlashDecorator.php avec le contenu:

<?php
declare(strict_types=1);
namespace MyVendor\SitePackage\Routing\Enhancer;

use TYPO3\CMS\Core\Routing\Enhancer\AbstractEnhancer;
use TYPO3\CMS\Core\Routing\Enhancer\DecoratingEnhancerInterface;
use TYPO3\CMS\Core\Routing\RouteCollection;

class ForceAppendingSlashDecorator extends AbstractEnhancer implements DecoratingEnhancerInterface
{
    /**
     * {@inheritdoc}
     */
    public function getRoutePathRedecorationPattern(): string
    {
        return '\/$';
    }

    /**
     * {@inheritdoc}
     */
    public function decorateForMatching(RouteCollection $collection, string $routePath): void
    {
        foreach ($collection->all() as $route) {
            $route->setOption('_decoratedRoutePath', '/' . trim($routePath, '/'));
        }
    }

    /**
     * {@inheritdoc}
     */
    public function decorateForGeneration(RouteCollection $collection, array $parameters): void
    {
        foreach ($collection->all() as $routeName => $existingRoute) {
            $existingRoutePath = rtrim($existingRoute->getPath(), '/');
            $existingRoute->setPath($existingRoutePath . '/');
        }
    }
}

Veuillez remplacer le jeu de noms correct correspondant à votre package de site.

Pour enregistrer votre améliorateur de route, ajoutez la ligne à votre ext_localconf.php:

$GLOBALS['TYPO3_CONF_VARS']['SYS']['routing']['enhancers']['ForceAppendingSlash'] = \MyVendor\SitePackage\Routing\Enhancer\ForceAppendingSlashDecorator::class;

Enfin, insérez le code suivant dans le fichier yaml de la configuration de votre site:

routeEnhancers:
  PageTypeSuffix:
    type: ForceAppendingSlash

Après ces ajustements, TYPO3 ajoutera toujours un ajout/à vos URL afin que les nouvelles URL correspondent aux anciennes créées par realurl.

7
Tim Schreiner

En plus de la réponse de Tim Schreiner, j’ai posé une condition dans le fichier .htaccess, qui redirige les URL sans barres obliques vers l’URL suivie d’un slash . Les fichiers ne devraient pas être affectés par cette condition ...__ vers le fichier .htaccess:

# EXTRA: Enforce trailing slash. Ignore trailing slash on file endings 
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteCond %{REQUEST_FILENAME} !\.(gif|jpg|png|jpeg|css|js|xml|rss|txt)$ [NC]
RewriteCond %{REQUEST_URI} !\.(gif|jpg|png|jpeg|css|js|xml|rss|txt)$ [NC]
RewriteRule ^(.*[^/])$ /$1/ [L,R=301]
1
kimomat

Vous pouvez utiliser le paramètre PageTypeEnhancer pour le mappage et le paramètre type dans la configuration de votre site (fichier config.yaml):

routeEnhancers:
  PageTypeSuffix:
    type: PageType
    default: '/'
    map:
      '/': 0
0
Ben

Tim, êtes-vous sûr de getRoutePathRedecorationPattern ()?

Pour moi, cela fonctionnait dans deux instances TYPO3 (v9.5.3) totalement différentes en production, mais les deux projets ne fonctionnaient pas dans un conteneur ddev-container. Là, les slugCandidates ont toujours raté leur dernier caractère.

Changer le motif de "tout sauf slash" à "exactement une slash" le fait fonctionner.

public function getRoutePathRedecorationPattern(): string
{
    return '\/$';
}
0
Julian Hofmann