Magento 1.6.1 - 从购物车重定向到主页删除(使用Varnish运行)

时间:2012-03-13 16:04:28

标签: magento e-commerce varnish

我在Magento 1.6.1上遇到了一个非常奇怪的问题。

我们有3个平台,DEV,TST,LIVE(当前正在运行的网站)。

我们也在现场前面运行Varnish。

问题是,当您从购物车中删除某些内容(使用删除按钮)时,在LIVE网站上,您始终会被重定向到主页。如果您通过将数量设置为0来删除项目,那么就可以了。

在DEV或TST上的相同代码库中不会发生此问题。

这可能是油漆以某种方式干扰吗?有什么建议?

2 个答案:

答案 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来完成。