Cookie不适用于子域


11

我们的主要网站为example.com。登录到example.com/admin那里工作正常。

但是在一个测试站点上,test.example.com/admin如果不先删除所有example.comcookie,就无法登录到管理员。然后,我可以登录,但是一旦我登录到example.com/admin下一个测试服务器,就将我踢回到登录页面。

我不知道这是否会影响客户登录。

主站点或测试站点中是否有一些配置可以解决此问题?

Answers:


14
  1. 在管理菜单上,选择系统>配置。然后,在左侧面板的“常规”下,单击“ Web”。
  2. 展开“会话Cookie管理”部分

example.com商店中,设置以下内容:

  1. 将Cookie域设置为example.com(通常此设置为.example.com,前面加一个点,在这种情况下,您可以尝试不使用它)。

test.example.com商店中,设置以下内容:

  1. 在测试环境上将Cookie域设置为.test.example.com。(此处的域前面的“。”应该可以)

2
请注意,有关.域前面的第3步很重要!
B00MER 2015年

嗨,安娜。是否应在管理员和/或example.com管理员中将Cookie域设置为“ .example.com” test.example.com
Buttle Butkus 2015年

我将其设置为默认配置(我猜是您的example.com管理员)。因此,这意味着所有范围都为.example.com。
AnnaVölkl2015年

@AnnaVölkl我不确定在这里。您知道我在两台不同的机器上有两个完全独立的magento安装,对吗?一种使用example.com,另一种使用test.example.com。他们都有自己的管理员。但是您只是在告诉我为其中一位管理员设置域。您是说我应该把另一个留空吗?
Buttle Butkus

知道了 实际上,我不知道这些是2个单独的安装。总店经营有无www-Domain?您可以将Test上的Cookie域设置为,test.example.com并在主商店上设置为,www.example.com以避免Cookie重叠。
AnnaVölkl2015年

9

安娜提出了一些好的观点,她的答案将对很多人有用,但对我却不起作用,所以我发布了自己的答案。也许我的问题比她要解决的问题更为根本。

我的解决方案是将站点的域从更改example.comwww.example.com。实际上,我在互联网上的研究表明,诸如Amazon,Google,Ebay以及其他每个主要网站这样的网站之所以使用该www前缀,可能很大程度上是由于Cookie的工作方式。也许不吧。

Cookie的默认工作方式是将其应用于所有子域。因此,如果example.com向您发送一个cookie,然后您访问mail.example.comsmile.example.comdevsite.example.com,则您的浏览器会将该cookie发送给那些站点,并且那些站点将尝试使用该cookie。但是,除非他们都使用通用的会话文件夹,否则他们将无法找到您的会话。即使那样,由于数据库配置不同,应用程序结构不同等,您可能也会遇到问题。

进行更改涉及在我的htaccess根文件中创建301重定向,更改magento core_config_data数据库表中的安全/不安全网址,更改ServerNameApache中的站点VirtualHosts以及更新DNS /名称服务器设置。但这是值得的。

通过创建我的主站点www.example.com,它的cookie现在仅适用于其子域,例如mail.www.example.com(并且我们没有任何此类子域)。取得www.example.comCookie的客户端浏览器不会将其发送到devsite.example.com,问题已解决。另外,www在我们的域名前加一个域名真的很棒。


1
我希望我可以多次投票给这个答案。我几个月来一直在寻找解决方案,每个人都在谈论Cookie路径和Cookie域,但是如果您不使用www,那将无法解决问题。谢谢!!
布鲁诺·蒙泰罗

我们已经在cookie域中拥有www,但是它仍然会失败...
黑色

还有什么失败?
Buttle Butkus,

3

您可以简单地更改子域的adminhtml cookie名称。

文件有两个更改app/code/core/Mage/Core/Controller/Varien/Action.php

在功能preDispatch更改行中

/** @var $session Mage_Core_Model_Session */
$session = Mage::getSingleton('core/session', array('name' => $this->_sessionNamespace))->start();

$namespace = $this->_sessionNamespace.($_SERVER['SERVER_NAME']=='subdomain.example.com'?'_subdomain':'');
/** @var $session Mage_Core_Model_Session */
$session = Mage::getSingleton('core/session', array('name' => $namespace))->start();

功能setRedirectWithCookieCheck变更

/** @var $session Mage_Core_Model_Session */
session = Mage::getSingleton('core/session', array('name' => $this->_sessionNamespace));

$namespace = $this->_sessionNamespace.($_SERVER['SERVER_NAME']=='subdomain.example.com'?'_subdomain':'');
/** @var $session Mage_Core_Model_Session */
$session = Mage::getSingleton('core/session', array('name' => $namespace));

然后搜索文字

Mage::getSingleton('core/session', array('name' => 'adminhtml'));

在所有文件中替换为

Mage::getSingleton('core/session', array('name' => 'adminhtml'.($_SERVER['SERVER_NAME']=='subdomain.example.com'?'_subdomain':'')));

如果发现任何事件。


1
您可以用语言解释一下您的代码如何更改客户端和服务器Cookie交互以隔离会话吗?
Buttle Butkus

@ButtleButkus的问题是example.com/admin adminhtml为域设置cookie的名称.example.com。当您尝试通过test.example.com/admin进行授权时,它会尝试使用的Cookie adminhtml进行操作.test.example.com。Magento设置上的问题有所不同。主要问题是您不能从子域修改主域的cookie。上面的代码使Magento可以创建adminhtmlexample.com的cookie adminhtml_subdomain和subdomain.example.com的cookie ,因此它们不会以任何方式混合。更改subdomain为您使用的正确的。
maxvgi

这对于管理员方面是好的。但是前端端在这种解决方案中也应该更改cookie名称,对吗?
Buttle Butkus

@ButtleButkus你是对的。抱歉,我没有写这个因为我没有这种问题。
maxvgi

没关系,可能对某些人还是有用的。
Buttle Butkus

0

如果由于cookie问题仍然无法登录到前端(无法创建客户会话),请覆盖相应的核心文件

1.8.x之前的版本。版本-app / code / core / Mage / Customer / Model / session.php

从1.8.x开始 版本app / code / core / Mage / Core / Model / Session / Abstract.php

注释掉该线程中指出的行。这已解决了1.8.x之前版本商店上的前端客户登录问题。

/magento//a/34057/695

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.