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を構成して末尾の「/」を追加するにはどうすればよいですか?
常に追加/を追加するには、ルートエンハンサーデコレーターを自分で作成し、サイトパッケージに配置します。
サイトパッケージの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と一致するようにします。
PageTypeEnhancer for mapping&type parameter をサイト構成(config.yamlファイル)で使用できます。
routeEnhancers:
PageTypeSuffix:
type: PageType
default: '/'
index: ''
map:
'/': 0
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]
ティム、getRoutePathRedecorationPattern()について本当によろしいですか?
私にとっては、本番環境ではまったく異なる2つのTYPO3(v9.5.3)インスタンスで機能しましたが、どちらのプロジェクトもddev-containerでは機能しませんでした。そこで、slugCandidatesは常に最後の文字を逃しました。
パターンを「スラッシュを除くすべて」から「正確にスラッシュ」に変更すると、機能します。
public function getRoutePathRedecorationPattern(): string
{
return '\/$';
}