metmeer / magento2-multi-store-fix
修复在同时使用环境店铺定义和语言切换器时出现的重定向循环问题。
Requires
- php: ~5.6.0|~7.0.0
- magento/module-store: ^100.0.2
This package is not auto-updated.
Last update: 2024-09-29 02:13:32 UTC
README
通过结合 MAGE_RUN_CODE 环境变量和语言切换器来修复在 Magento 2 中使用多个店铺视图时的重定向循环问题。
描述
Magento 2 内置了一个店铺切换器(语言切换器/区域切换器),访客可以使用它来选择他们喜欢的语言。
如果选择了语言,访客将被重定向到其他店铺视图(语言)中的同一页面。店铺切换器使用一个 cookie 来记住请求之间选定的店铺代码。当多个店铺视图共享相同的 base url 时,这样做是有意义的,否则无法确定选定的店铺视图。
对于网店来说,拥有多个域名是很常见的,每个主机名显示相同内容的翻译版本。当访客选择另一种语言时,他可以直接被重定向到其他域名中的同一页面:使用请求的主机名来确定选定的店铺视图。设置此配置的推荐方法是配置 Web 服务器,将环境变量 MAGE_RUN_TYPE 设置为 store,将 MAGE_RUN_CODE 设置为根据请求的主机名正确的店铺代码:查看详情。
如果店铺代码同时存在于店铺切换器 cookie 和服务器环境变量中,Magento 将使用 cookie 中的那个。这没有意义。它破坏了店铺切换,甚至可能导致重定向循环。
示例
想象以下有两个店铺视图的 Magento 2 网店
- 访客打开
http://myshop.com/。在处理请求时,Magento 没有找到 cookie,但环境变量设置为default,因此显示 英语 店铺视图。 - 访客从语言切换器中选择 荷兰语。
- Magento 将
myshop.com的 cookie 设置为nl并将访客重定向到http://myshop.nl/。 - 访客的浏览器请求
http://myshop.nl/。Magento 没有找到 cookie(因为它为其他域名设置),但环境变量设置为nl,因此显示 荷兰语 店铺视图。到目前为止,没有问题。 - 现在,访客尝试使用语言切换器切换回 英语。
- Magento 将
myshop.nl的 cookie 设置为default并将访客重定向到http://myshop.com/。 - 访客的浏览器请求
http://myshop.com/。Magento 找到 cookie(来自步骤 3)设置为nl并忽略环境变量。它加载 荷兰语 店铺视图,但由于主机名不匹配,它重定向到http://myshop.nl/。 - 访客的浏览器请求
http://myshop.nl/。Magento 找到 cookie(来自步骤 6)设置为default并忽略环境变量。它加载 英语 店铺视图,但由于主机名不匹配,它重定向到http://myshop.com/。 - 步骤 7 和 8 将被重复执行,直到浏览器放弃并显示 太多重定向 错误消息
解决方案
本模块使用了一个插件,该插件针对Magento的StoreCookieManager::getStoreCodeFromCookie方法,该方法负责从地区切换器cookie中读取店铺代码。它由StoreResolver::getCurrentStoreId调用,该调用在数据库中查找店铺代码并返回其ID。
如果通过环境变量设置了店铺代码,插件将不会读取cookie,而是返回由web服务器定义的店铺代码。这样,cookie永远不会覆盖环境变量。
插件检查MAGE_RUN_TYPE是否设置为store并且MAGE_RUN_CODE包含一个字符串值。这样,它不会破坏其他设置。例如,当MAGE_RUN_TYPE设置为website时,上述问题不会发生,并且不需要修复。
安装
安装此模块的首选方法是使用Composer。只需将metmeer/magento2-multi-store-fix作为依赖项添加,Composer就会负责下载并提取文件到正确的位置
composer require metmeer/magento2-multi-store-fix
可选地,您可以在此处下载模块的最新版本,并将存档的内容复制到您的项目中的app/code/METMEER/MultiStoreFix目录下。
文件安装完成后,可以使用以下命令启用模块
bin/magento module:enable METMEER_MultiStoreFix
每次启用新模块时,Magento都需要升级数据库。这是通过以下命令完成的
bin/magento setup:upgrade
如果部署模式设置为生产,则需要运行依赖注入编译器。对于开发模式,这不是必需的。要启动编译器,请使用此命令
bin/magento setup:di:compile
最后,应该使用此命令清除缓存
bin/magento cache:flush
配置
不需要进一步配置。当需要时,修复将自动应用。
贡献
请随时通过报告问题或创建改进的拉取请求来为此模块做出贡献。
许可证
本项目根据MIT许可证授权 - 请参阅LICENSE文件以获取详细信息。
版权
版权所有(c)2017 METMEER - 保留所有权利。

