404在带有产品商店的商店开关上,视图示波器键
-
16-10-2019 - |
题
默认 URL Key
在产品页面上是全局范围的。
编辑:正如Florinelchis所建议的那样,范围可能是管理属性的变化。但是,这打破了商店视图切换器的行为。
这已在1.7.0.2上测试,并带有样本数据和 启用“将存储代码添加到URL”:
- 编辑产品并为特定商店视图(法语)设置其他URL
- 重新索引
- 英语商店视图上网站上的打开产品页面
- 切换到法语:您将拥有页面URL CONTA
/French/
切换回英语 - > 404页错误(URL错过了商店代码
/default/
如何通过商店视图/语言开关使其正常工作?
细节:
- 英语的URL:
/default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html
- 法语的URL:
/french/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html
如果我在此页面上的英语网站 - > /default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html
然后我切换到法语:
我得到了这个URL(遗漏了商店代码):
MAGEDOMAIN/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html
因此,Magento正确地重写URL,但由于某种原因错过了商店代码
参考:
可以肯定这与 /core/model/store.php
和 /core/model/url/rewrite.php
, ,特别是这些方法:
Mage_Core_Model_Url_Rewrite::rewrite
Mage_Core_Model_Store::getCurrentUrl
更新
如果您使用1.9.1 @vinai修复程序将不起作用,请检查我添加的新答案
解决方案 3
Magento 1.9.1的一些更新信息
由于其他原因,该功能仍然损坏了这个版本中的错误@vinai指出了该版本已解决的问题(对于可配置的产品)
问题真正的问题可能在这里 Mage_Catalog_Model_Resource_Url
但是我没有时间,也不想触摸核心的如此微妙的部分。
解决方法的解释:
入口点始终是此类Mage_Core_Model_Url_Rewrite_Request
特别是该方法 _rewriteDb()
如何 _rewriteDb()
作品:
- 首先,它尝试加载当前商店的请求
(139): $this->_rewrite->loadByRequestPath($requestCases);
- 然后,如果我找不到它(没有ID)并且有一个
___from_store
范围
(142): if (!$this->_rewrite->getId() && $fromStore) {
- 尝试加载重写
___from_store
:
(152): $this->_rewrite->setStoreId($fromStoreId)->loadByRequestPath($requestCases);
- 如果找到了,它使用
id_path
为当前商店加载一个:
(159): $this->_rewrite->setStoreId($currentStore->getId())->loadByIdPath($this->_rewrite->getIdPath());
一切看起来都不错,但是url_rewrite数据中存在一个问题,因此索引功能(至少对于可配置的产品):
- 即使我们要切换商店并且新商店具有不同的URL,也可以在第139行中重写。
问题是此重写指向错误 id_path
(而不是指向可配置的产品ID,而是指向其简单产品ID之一)
现在,解决方法是删除 !$this->_rewrite->getId()
条件,因此,洋红色试图在那里时始终找到重定向 $fromstore
范围
- 最好的是修复
catalog_url
索引并删除其创建的错误重写。
在这里,快速解决方法的代码(您需要创建一个模块并重写 Mage_Core_Model_Url_Rewrite_Request
自我上课):
protected function _rewriteDb()
{
if (null === $this->_rewrite->getStoreId() || false === $this->_rewrite->getStoreId()) {
$this->_rewrite->setStoreId($this->_app->getStore()->getId());
}
$requestCases = $this->_getRequestCases();
$fromStore = $this->_request->getQuery('___from_store');
if ($fromStore) {
$stores = $this->_app->getStores(false, true);
if (!empty($stores[$fromStore])) {
/** @var $store Mage_Core_Model_Store */
$store = $stores[$fromStore];
$fromStoreId = $store->getId();
} else {
return parent::_rewriteDb();
}
$this->_rewrite->setStoreId($fromStoreId)->loadByRequestPath($requestCases);
if (!$this->_rewrite->getId()) {
return parent::_rewriteDb();
}
// Load rewrite by id_path
$currentStore = $this->_app->getStore();
$this->_rewrite->setStoreId($currentStore->getId())->loadByIdPath($this->_rewrite->getIdPath());
$this->_setStoreCodeCookie($currentStore->getCode());
$targetUrl = $currentStore->getBaseUrl() . $this->_rewrite->getRequestPath();
$this->_sendRedirectHeaders($targetUrl, true);
}
if (!$this->_rewrite->getId()) {
return parent::_rewriteDb();
}
$this->_request->setAlias(Mage_Core_Model_Url_Rewrite::REWRITE_REQUEST_PATH_ALIAS,
$this->_rewrite->getRequestPath());
$this->_processRedirectOptions();
return true;
}
其他提示
问题是模型中的错误 Mage_Core_Model_Url_Rewrite_Request
(Magento 1.8)和 Mage_Core_Model_Url_Rewrite
(较早版本)。
1.8中的核心代码部分看起来像这样:
// Section from Mage_Core_Model_Url_Rewrite_Request::_rewriteDb()
$fromStore = $this->_request->getQuery('___from_store');
if (!$this->_rewrite->getId() && $fromStore) {
$stores = $this->_app->getStores();
if (!empty($stores[$fromStore])) {
$store = $stores[$fromStore];
$fromStoreId = $store->getId();
} else {
return false;
}
错误:查询参数的值是商店代码(在我的情况下 de
, en
或者 fr
)。数组的钥匙返回 app->getStores()
是 数字 存储ID。这就是为什么 if (!empty($stores[$fromStore])) {
总是失败。
一旦修复了该错误,在同一方法中以后将显而易见另一个错误(我认为仅在1.8中):
$targetUrl = $this->_request->getBaseUrl() . '/' . $this->_rewrite->getRequestPath();
请求对象base URL始终是Magento base_url, 没有 商店代码。使用 $currentStore->getBaseUrl()
而是在那里修复了该错误。
一旦解决了这两个问题,语言切换器正常工作。这是一个扩展程序,完全适用于Magento 1.8(CE): https://github.com/vinai/vinaikopp_storeurlrewrites
在Magento 1.7中,问题可能有所不同。我仍然以为我会添加这个答案,以防万一Google将其他运行1.8或更新的人带到这里。
实际上,我在Magento 1.7.0.2上找到了此问题的解决方法,如果您正在运行Magento 1.8,请访问Vinai的详细说明:
看起来该问题的一部分与请求控制器有关 Mage_Core_Controller_Request_Http
.
如果您查看第161行,有以下条件:
elseif ($storeCode !== '') {
$this->setActionName('noRoute');
}
当我切换到类别/产品页面中的其他商店时,请评论它解决404错误。
但是,由于某些未知原因,在某个时候,在响应URL中遗漏了商店代码,但这不再引起问题,因为两个URL现在都起作用:
- magedomain/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html
- magedomain/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html
我不清楚这种情况的评论是否会引起其他问题
URL键 是一个属性。您可以从: 目录 - >属性 - >管理属性。搜索 url_key 然后单击它。
更改 范围 并保存。
现在,您可以在每个商店视图上使用其他URL键。
因此,您想更改每个商店视图的URL吗?
目前,您修改了分数范围的产品URL,以使法国商店与您的英式商店不同吗?当您在两者之间切换时,您将获得404。这是预期的行为。
Magento不会存储不同的URL重写以供其他商店视图。所以当你击中 /french/product1
在法国商店,URL将在桌子中匹配,并将加载。但是,当您在英国商店中击中它时,将没有匹配,因此将404。
听起来您需要的只是“将存储代码添加到URL” - 这将使您的URL键单独使用,但是所有相应的URL都带有您的商店代码。然后,这应该允许您的商店切换器运行。