看起来好像 Magento 2 默认删除了尾部斜杠。有什么办法可以改变这种情况吗?我试图在 .htaccess 文件中找到重定向该代码的代码。每当我添加以下代码时,都会有一个大的重定向链导致网站速度变慢。
RewriteCond %{REQUEST_FILENAME} !-f 重写规则 ^(.*[^/])$ /$1/ [L,R]
我希望所有网址末尾都有斜杠。 https://www.example.com/category/。目前,它们重定向到非尾随斜杠 https://www.example.com/category
您可以尝试以下类别/产品 URL:
商店 --> 设置 --> 配置 --> 目录 --> 目录 --> 搜索引擎优化 --> 类别 URL 后缀
将值设置为:
/
首先在开发环境中尝试。
您可以使用此解决方案附加尾部斜杠,如果您想跳过特定模块以在这两种情况下附加尾部斜杠,您可以根据您的要求使用此代码更新逻辑。
首先创建事件文件。
app/code/[自定义模块]/[模块名称]/etc/frontend/events.xml
<event name="controller_action_predispatch">
<observer name="add_slash_in_url" instance="[Custom_Module]/[Module_Name]\Observer\PredispathActionControllerObserver" />
</event>
创建观察者文件。 应用程序/代码/[自定义模块]/[模块名称]/Observer/PredispathActionControllerObserver.php
<?php
namespace [Custom_Module]\[Module_Name]\Observer;
use Magento\Framework\App\ActionFlag;
use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\UrlInterface;
/**
* Class Predispath Frontend Action Controller Observer
*/
class PredispathActionControllerObserver implements ObserverInterface
{
/**
* @var UrlInterface
*/
protected $urlInterface;
/**
* @var \Magento\Framework\App\ActionFlag
*/
protected $actionFlag;
/**
* @var []
*/
protected $skipModule = [
'cms',
'cms_page',
'cms_block',
'catalog'
];
/**
* @param UrlInterface $urlInterface
* @param ActionFlag $actionFlag
*/
public function __construct(
UrlInterface $urlInterface,
ActionFlag $actionFlag
) {
$this->actionFlag = $actionFlag;
$this->urlInterface = $urlInterface;
}
/**
* Execute Observer
*
* @param \Magento\Framework\Event\Observer $observer
* @throws \Magento\Framework\Exception\NoSuchEntityException
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
public function execute(\Magento\Framework\Event\Observer $observer)
{
$currentUrl = $this->urlInterface->getCurrentUrl();
$result = explode('?', $currentUrl);
$result[0] = trim($result[0], '/') . '/';
$urlSlash = implode('?', $result);
if ($urlSlash != $currentUrl) {
$controller = $observer->getEvent()->getData('controller_action');
if (empty($controller) || !is_object($controller) || !$controller ||
!method_exists($controller, 'getRequest') ||
empty($controller->getRequest()) || !$controller->getRequest() ||
empty($controller->getRequest()->getModuleName()) || !$controller->getRequest()->getModuleName() ||
in_array($controller->getRequest()->getModuleName(), $this->skipModule)) {
return;
}
if ($controller->getRequest()->isXmlHttpRequest()
|| $controller->getRequest()->isPost()
) {
return;
}
$this->actionFlag->set('', \Magento\Framework\App\ActionInterface::FLAG_NO_DISPATCH, true);
$controller->getResponse()->setRedirect($urlSlash, 301)->sendResponse();
}
}
}