如何在 TYPO3 v9 URL 中添加斜杠?
Posted
技术标签:
【中文标题】如何在 TYPO3 v9 URL 中添加斜杠?【英文标题】:How can I add a trailing slash to TYPO3 v9 URLs? 【发布时间】: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 以添加尾随“/”?
【问题讨论】:
【参考方案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 核心支持这一点,请参阅另一个答案以获取更简单、更现代的方法 ***.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/ 结尾。 是否有人在使用此解决方案并配置了页面浏览器? 是的,例如使用 ***.com/questions/54420293/… 上的新闻模块 完美,搜索了一段时间……同时使用 TYPO3 10.4.6index: ''
在技术上不需要以上是关于如何在 TYPO3 v9 URL 中添加斜杠?的主要内容,如果未能解决你的问题,请参考以下文章
未执行 TYPO3 v9 上具有 StaticMappableAspectInterface 的自定义路由方面
从 TYPO3 v9 升级到 v10 后:显示页面不再工作(无法访问受保护的财产)