Magento自定义控制器操作被调用两次

时间:2015-09-02 07:01:57

标签: php magento magento-1.9

我在rwd主题中添加了一个ajax添加到购物车,并且每个http请求都会调用两次动作控制器。欢迎任何有关解决问题或调试的帮助,我已经失去了2周。这一切都适用于我们的开发环境,但在升级时表现得很奇怪。开发环境在MAMP上本地托管,暂存托管在OVH共享主机上。

edit2:删除了无关的信息

1 个答案:

答案 0 :(得分:0)

在error.log中发现此错误消息 FastCGI:comm with server" /..../ staging / index.php"中止:错误解析标题:重复标题'内容类型',引用者:http://staging.xxxx.be/product.html

此处也找到了解决方案:http://blog.imseo.it/2014/09/08/magento-fastcgi-error-parsing-headers-duplicate-header/

解决方法是替换sendHeaders函数 应用程序/代码/核心/法师/核心/控制器/响应/ Http.php

public function sendHeaders()
{
    if (!$this->canSendHeaders()) {
        Mage::log('HEADERS ALREADY SENT: '.mageDebugBacktrace(true, true, true));
        return $this;
    }
    if (in_array(substr(php_sapi_name(), 0, 3), array('cgi', 'fpm')))
    {
        // remove duplicate headers
        $remove = array('status', 'content-type');

        // already sent headers
        $sent = array();
        foreach (headers_list() as $header)
        {
            // parse name
            if (!$pos = strpos($header, ':'))
                    continue;
            $sent[strtolower(substr($header, 0, $pos))] = true;
        }

        // raw headers
        $headersRaw = array();
        foreach ($this->_headersRaw as $i=>$header)
        {
            // parse name
            if (!$pos = strpos($header, ':'))
                    continue;
            $name = strtolower(substr($header, 0, $pos));

            if (in_array($name, $remove))
            {
                    // check sent headers
                    if ($sent[$name])
                    {
                        unset($this->_headersRaw[$i]);
                        continue;
                    }

                    // check header
                    if (!is_null($existing = $headers[$name]))
                    {
                        $this->_headersRaw[$existing] = $header;
                        unset($this->_headersRaw[$i]);
                    }
                    else
                        $headersRaw[$name] = $i;
            }
        }

        // object headers
        $headers = array();
        foreach ($this->_headers as $i=>$header)
        {
            $name = strtolower($header['name']);
            if (in_array($name, $remove))
            {
                    // check sent headers
                    if ($sent[$name])
                    {
                        unset($this->_headers[$i]);
                        continue;
                    }

                    // check header
                    if (!is_null($existing = $headers[$name]))
                    {
                        $this->_headers[$existing] = $header;
                        unset($this->_headers[$i]);
                    }
                    else
                        $headers[$name] = $i;

                    // check raw headers
                    if (!is_null($existing = $headersRaw[$name]))
                        unset($this->_headersRaw[$existing]);
            }
        }
    }

    parent::sendHeaders();
}