【问题标题】:How can I add a trailing slash to TYPO3 v9 URLs?如何在 TYPO3 v9 URL 中添加斜杠?
【发布时间】:2019-04-08 05:37:27
【问题描述】:

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

【问题讨论】:

    标签: typo3 typo3-9.x


    【解决方案1】:

    要始终添加附加 /,您可以自己创建一个路由增强器装饰器并将其放入您的站点包中。

    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 匹配。

    【讨论】:

    • 这应该是一个核心的东西,并且在后端很容易配置。感谢分享。
    • 既然 TYPO3 核心支持这一点,请参阅另一个答案以获取更简单、更现代的方法 stackoverflow.com/a/54441848/2819581
    • 这可以通过配置来完成。不需要单独的类。
    【解决方案2】:

    除了 Tim Schreiner 的回答之外,我在 .htaccess 文件中创建了一个条件,它将不带斜杠的 url 重定向到带有斜杠的 url。 文件不应受到这种情况的影响。 我是否将以下条件添加到 .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]
    

    【讨论】:

    • 这是一个 301 重定向,比 302 更好。但不如一开始就能够生成带有尾随 / 的链接。不必要的重定向是邪恶的。恕我直言,确实需要在 TYPO3 本身中进行配置。
    • 如果您执行该重定向,请确保您的非默认语言站点配置确实与您的斜杠选项相对应!否则你可能会在一个无限的重定向循环中运行。
    • 此外,此解决方案仅适用于 Apache Webserver。如果您有 nginx 或其他提供站点的东西,您将需要另一个解决方案。所以我完全同意这应该在核心中配置,而不是防止像这样的解决方法。
    【解决方案3】:

    Tim,你确定 getRoutePathRedecorationPattern() 吗?

    对我来说,它在生产中的两个完全不同的 TYPO3 (v9.5.3) 实例中工作,但两个项目都不能在 ddev 容器中工作。在那里,slugCandidates 总是错过它的最后一个字符。

    将模式从“除斜线之外的所有”更改为“完全斜线”即可。

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

    【讨论】:

    • 我建议将问题移到不太显眼的位置。试着把它变成一个更自信的答案。也许对你自己的答案写评论(你可以,你知道)与蒂姆讨论。
    • 我可以批准这个。我最近从 9.5.1 更新到 9.5.4,我的网站坏了。我 9.5.1,我显示的解决方案对我有用。我9.5.4,它打破了网站。将其更改为您的解决方案也对我有用。
    【解决方案4】:

    您可以在站点配置(config.yaml 文件)中使用PageTypeEnhancer for mapping &type parameter

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

    【讨论】:

    • 谢谢,我已经对此进行了测试,它似乎适用于 TYPO3 9.5.5,因此是一个更好的解决方案。在早期版本中,当使用 pageType 增强器时,您的主页会出现双 / 。另请参阅我的编辑,以免您的 rootpage 以 /index/ 结尾。
    • 是否有人在使用此解决方案并配置了页面浏览器?
    • 是的,例如使用 stackoverflow.com/questions/54420293/… 上的新闻模块
    • 完美,搜索了一段时间……同时使用 TYPO3 10.4.6
    • index: '' 在技术上不需要
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    相关资源
    最近更新 更多