出于某种原因,在调试之后我注意到只有在我通过在rm -rf *
文件夹中执行手动var
清除缓存后,form_keys才有效,清除浏览器缓存并重试站点。
我没有对核心代码进行任何更改,我将它扩展到最初的1.8.1安装,它们完全相同。
我遇到的原始问题是客户无法登录,因为我一直在使用1.7.0.2版本的customer/persistent/login.phtml
文件,并且必须更改它以将form_key
添加为隐藏输入元素使用所有其他帖子中显示的方法,关于magento 1.8.1中新添加的表单键。
我启用了验证码,出于某种原因,当我进入客户登录时,验证码不会显示。
随机地,我不知道我做了什么,页面刷新了,并且显示了验证码,我能够登录仪表板并且工作正常。然后我退出了,同样的问题发生了,客户使用正确的用户名/密码登录,但被重定向到同一个客户登录页面。
我已经从loginPostAction
调试了AccountController.php
中的app/code/core/mage/customer/controllers
,看来当表单密钥有效时,刷新缓存,清除缓存,在法师和浏览器中,它到达if( getIsJustConfirmed == true){ go to __welcomedashboard(..) }
但getIsJustConfirmed
会返回null
或false
。
我检查了getIsJustConfirmed
的设置位置,它显示在setCustomer
内Session.php
的{{1}}内:
app/code/core/mage/customer/Session.php
public function setCustomer(Mage_Customer_Model_Customer $customer)
{
// check if customer is not confirmed
if ($customer->isConfirmationRequired()) {
if ($customer->getConfirmation()) {
return $this->_logout();
}
}
$this->_customer = $customer;
$this->setId($customer->getId());
// save customer as confirmed, if it is not
if ((!$customer->isConfirmationRequired()) && $customer->getConfirmation()) {
$customer->setConfirmation(null)->save();
$customer->setIsJustConfirmed(true);
}
return $this;
}
的第一部分始终返回!$customer->isConfirmationRequired()
,但true
会返回$customer-->getConfirmation()
,因此它不会null
。
答案 0 :(得分:2)
正如您已经注意到的那样,Magento 1.8将表单键添加到了很多表单中。隐藏输入字段中的表单键需要与用户会话中的表单键匹配。这会破坏任何形式的缓存,因为存储在块或整页缓存中的表单密钥不太可能与用户的会话密钥匹配。
首先,我假设您已经将已复制到自定义主题中的模板与基本/默认版本进行了比较,并添加了表单键,无论它们在哪里丢失。
然后,下一个建议是关闭Magento中的所有缓存(以及任何整页缓存,如Varnish),看看是否能解决问题。这将确认您在某处缓存表单密钥,这是导致问题的原因。
接下来,使用像Fabrizio的高级模板提示这样的工具来查看是否通过父块显式或隐式地缓存了包含表单键的任何模板。如果是这样,这就是问题的原因,您需要调查导致这些块被缓存的原因。一个股票Magento系统不会缓存这些块,但第三方扩展可能会导致它。
最后,一旦解决了块缓存,您就需要考虑全速缓存(如果使用的话)。这里没有简单的答案,您不需要将受影响的页面缓存在FPC中,或者找到一种方法将正确的表单密钥放入页面中。
答案 1 :(得分:1)
一步一步,我遇到了同样的问题。我开始在每个页面加载时记录Mage::log(Mage::getSingleton('core/session')->getFormKey());
的会话密钥输出。
在尝试以客户身份登录之前,会话保持一致 但是,在尝试登录后,我确定会话在每个页面加载时都失效(即上述日志记录方法在每个页面加载时回显了不同的表单键)。
这导致了我的cookie。我注意到,在尝试以客户身份登录后,浏览器存储了两个frontend
个Cookie:一个包含.my_domain.com
,另一个包含my_domain.com
,从而导致无效。
将System -> Configuration -> General -> Web
下的Cookie域设置为my_domain.com
,解决了重复的Cookie问题,并且表单按预期运行。