如何在TYPO3 v9 URL中添加斜杠?

时间:2018-11-04 19:31:53

标签: typo3 typo3-9.x

从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以添加结尾的“ /”?

4 个答案:

答案 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 '\/$';
}