从TYPO3 8.7更新到TYPO3 9.5时,您可能会放弃realurl扩展,以支持新的路由功能。
但是您可能会注意到,默认情况下,realurl在所有URL后面都添加了一个/(当您不使用html后缀时) TYPO3路由功能默认情况下不执行此操作,并且内核中当前没有选项来启用此功能。 为什么这是个问题? 在TYPO3 8.7中,您获得了一个URL,例如www.domain.tld / subpage /。在TYPO3 9.5中,使用URL www.domain.tld / subpage调用同一页面。 因此,即使是同一页面,对于搜索爬网程序来说,这也是另一个URL。当使用附加的/调用URL时,TYPO3会执行307重定向,但是您可能希望使用旧的URL结构。
如何配置TYPO3以添加结尾的“ /”?
答案 0 :(得分:10)
要始终添加一个附加/,您可以创建一个路由增强器修饰符并将其放在您的站点包中。
在站点包中的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匹配。
答案 1 :(得分:2)
除了蒂姆·施雷纳(Tim Schreiner)的回答外,我在.htaccess文件中设置了条件,该文件将没有斜杠的URL重定向到带有斜杠的URL。 文件不应受到这种情况的影响。 我已将以下条件添加到.htaccess文件中:
Failed to load <snip>/solibs/_gnuRelease/libLink.so
dlerror = <snip>: undefined symbol: _ZN24ChannelSelection7INVALIDE ( ChannelSelection::INVALID )
Failed to load <snip>/solibs/_gnuRelease/libBitTrue.so
dlerror = <snip>: undefined symbol: _ZTIN8StarLibs7LinkSim8StarFPGAE ( typeinfo for StarLibs::LinkSim::StarFPGA )
答案 2 :(得分:2)
您可以在站点配置(config.yaml文件)中使用PageTypeEnhancer for mapping &type parameter:
routeEnhancers:
PageTypeSuffix:
type: PageType
default: '/'
index: ''
map:
'/': 0
答案 3 :(得分:1)
蒂姆,您确定要使用getRoutePathRedecorationPattern()吗?
对我来说,它在生产中的两个完全不同的TYPO3(v9.5.3)实例中工作,但是两个项目在ddev容器中都不起作用。在那里,slugCandidates总是错过了最后一个字符。
将模式从“除斜杠之外的所有字符”更改为“恰好是斜杠”即可。
public function getRoutePathRedecorationPattern(): string
{
return '\/$';
}