我在Magento 1.6.1上遇到了一个非常奇怪的问题。
我们有3个平台,DEV,TST,LIVE(当前正在运行的网站)。
我们也在现场前面运行Varnish。
问题是,当您从购物车中删除某些内容(使用删除按钮)时,在LIVE网站上,您始终会被重定向到主页。如果您通过将数量设置为0来删除项目,那么就可以了。
在DEV或TST上的相同代码库中不会发生此问题。
这可能是油漆以某种方式干扰吗?有什么建议?
答案 0 :(得分:2)
您是在dev / staging网站上运行Varnish吗?听起来不像你。
我猜你的Magento Varnish模块有一个观察者来检测购物车是否有任何内容(即看看你是否确实有一个独特的会话),但当你清空你的购物车时,这个观察者然后将nocache标题触发到Varnish,Varnish返回一个新的(缓存的,非cookie)响应并将您弹回主页。
这听起来像是你的Varnish模块。
删除Varnish及其相关的Magento模块,然后重新测试。似乎是一种相当简单的方法来排除它。
答案 1 :(得分:0)
在配置我的本地环境以在Nginx前使用Varnish时,让我印象深刻的一件事是应用程序重定向开始行动起来很奇怪。从产品视图添加用于比较的产品会将我重定向到基本URL,而不是返回到产品视图(referer)。所以我开始深入挖掘核心,看看究竟发生了什么。
app/code/core/Mage/Core/Controller/Varien/Action.php:773
_getRefererUrl
方法在请求URI或请求标头中查找任何引用URL。出于某种原因,$refererUrl
没有传递为_isUrlInternal
,这使得它回退到基本网址。
/**
* Identify referer url via all accepted methods (HTTP_REFERER, regular or base64-encoded request param)
*
* @return string
*/
protected function _getRefererUrl()
{
$refererUrl = $this->getRequest()->getServer('HTTP_REFERER');
if ($url = $this->getRequest()->getParam(self::PARAM_NAME_REFERER_URL)) {
$refererUrl = $url;
}
if ($url = $this->getRequest()->getParam(self::PARAM_NAME_BASE64_URL)) {
$refererUrl = Mage::helper('core')->urlDecode($url);
}
if ($url = $this->getRequest()->getParam(self::PARAM_NAME_URL_ENCODED)) {
$refererUrl = Mage::helper('core')->urlDecode($url);
}
$refererUrl = Mage::helper('core')->escapeUrl($refererUrl);
if (!$this->_isUrlInternal($refererUrl)) {
$refererUrl = Mage::app()->getStore()->getBaseUrl();
}
return $refererUrl;
}
app/code/core/Mage/Core/Controller/Varien/Action.php:799
这里Magento正在寻找(基础URL)字符串http://domain.com/在(引用网址)http://domain.com:8080/any/url.html中的位置,由于Nginx正在监听的端口号(在Varnish后面),它永远不会被找到)。
/**
* Check url to be used as internal
*
* @param string $url
* @return bool
*/
protected function _isUrlInternal($url)
{
if (strpos($url, 'http') !== false) {
/**
* Url must start from base secure or base unsecure url
*/
if ((strpos($url, Mage::app()->getStore()->getBaseUrl()) === 0)
|| (strpos($url, Mage::app()->getStore()->getBaseUrl(Mage_Core_Model_Store::URL_TYPE_LINK, true)) === 0)
) {
return true;
}
}
return false;
}
app/code/core/Mage/Core/Helper/Url.php:37
在Magento中构建当前URL时,添加了(由于某些奇怪的原因)端口号。
/**
* Retrieve current url
*
* @return string
*/
public function getCurrentUrl()
{
$request = Mage::app()->getRequest();
$port = $request->getServer('SERVER_PORT');
if ($port) {
$defaultPorts = array(
Mage_Core_Controller_Request_Http::DEFAULT_HTTP_PORT,
Mage_Core_Controller_Request_Http::DEFAULT_HTTPS_PORT
);
$port = (in_array($port, $defaultPorts)) ? '' : ':' . $port;
}
$url = $request->getScheme() . '://' . $request->getHttpHost() . $port . $request->getServer('REQUEST_URI');
return $url;
}
让重定向再次工作
在不改变应用程序的情况下,您的网络服务器(Nginx)需要在端口80(或443)上进行侦听,同时仍然将Varnish保留在其前面。这可以通过使用iptables来完成。