web-dev-qa-db-ja.com

TYPO3 v9 URLに末尾のスラッシュを追加するにはどうすればよいですか?

TYPO3 8.7からTYPO3 9.5に更新する場合、新しいルーティング機能のためにrealurl拡張を削除する可能性があります。

しかし、気づくかもしれませんが、realurlはデフォルトですべてのURLに/を追加します(htmlサフィックスを使用していない場合)。TYPO3ルーティング機能はデフォルトではそれを行わず、現在これを有効にするオプションがコアにありません。なぜこれが問題なのですか? TYPO3 8.7では、www.domain.tld/subpage /のようなURLを取得しました。 TYPO3 9.5では、同じページがURL www.domain.tld/subpageで呼び出されます。したがって、これが同じページであっても、検索クローラーの場合、これは別のURLです。 TYPO3は/を付加してURLを呼び出すと307リダイレクトを行いますが、古いURL構造を使用したい場合があります。

TYPO3を構成して末尾の「/」を追加するにはどうすればよいですか?

9
Tim Schreiner

常に追加/を追加するには、ルートエンハンサーデコレーターを自分で作成し、サイトパッケージに配置します。

サイトパッケージのClasses/Routing/Enhancer/ForceAppendingSlashDecorator.phpの下に次の内容のファイルを作成します。

<?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 . '/');
        }
    }
}

置き換えて、サイトパッケージに一致する正しい名前空間を設定してください。

ルートエンハンサーを登録するには、ext_localconf.phpに次の行を追加します。

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

最後のステップとして、次のコードをサイト構成のyamlファイルに挿入します。

routeEnhancers:
  PageTypeSuffix:
    type: ForceAppendingSlash

この調整後、TYPO3は常にURLに/を追加して、新しいURLがrealurlで作成された古いURLと一致するようにします。

7
Tim Schreiner

PageTypeEnhancer for mapping&type parameter をサイト構成(config.yamlファイル)で使用できます。

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

Tim Schreinerからの回答に加えて、スラッシュなしのURLを末尾のスラッシュ付きのURLにリダイレクトする条件を.htaccessファイルで作成しました。ファイルはこの条件の影響を受けません。次の条件で.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]
3
kimomat

ティム、getRoutePathRedecorationPattern()について本当によろしいですか?

私にとっては、本番環境ではまったく異なる2つのTYPO3(v9.5.3)インスタンスで機能しましたが、どちらのプロジェクトもddev-containerでは機能しませんでした。そこで、slugCandidatesは常に最後の文字を逃しました。

パターンを「スラッシュを除くすべて」から「正確にスラッシュ」に変更すると、機能します。

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