Magento API错误:中止:解析标题时出错:重复标题'Content-Type'

时间:2011-05-11 18:09:24

标签: magento magento-1.4

我刚刚将服务器升级到PHP 5.3和Fast CGI。不幸的是,导致magento api返回一个奇怪的错误

aborted:解析标题时出错:重复标题'Content-Type'

我尝试了Magento四分之一的各种建议但无济于事。

我正在运行1.4.0.1。有关如何调和此问题的任何建议?

4 个答案:

答案 0 :(得分:4)

来自http://www.magentocommerce.com/boards/v/viewthread/229253/

编辑

app/code/core/Mage/Core/Controller/Response/Http.php

并使用以下代码替换sendHeaders()函数 (你不应该覆盖核心类,但这会使它工作。使用app / code / local / Mage / ...不起作用,因为它是一个控制器)

/**
 * Transport object for observers to perform
 *
 * @var Varien_Object
 */
protected static $_transportObject = null;

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 (isset($sent[$name]) && $sent[$name]) {
                    unset($this->_headersRaw[$i]);
                    continue;
                }

                // check header
                if (isset($headers[$name]) && !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 (isset($sent[$name]) && $sent[$name]) {
                    unset($this->_headers[$i]);
                    continue;
                }

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

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

    parent::sendHeaders();
}

答案 1 :(得分:0)

您使用的是哪个网络服务器?

检查您的Apache / nginx - fcgi是否配置为默认发送此标头。

答案 2 :(得分:0)

试试这个 - 按名称

删除
$this->getResponse()->clearHeader('Content-Type');

并添加标题

$this->getResponse()->setHeader('Content-Type', 'application/json');

答案 3 :(得分:0)

我见过一些与Magento和fcgi有关的网站。通常因为快速cgi被配置为默认发送标头。但是mod_php不会出现这个问题。大部分时间我都遇到过Ajax请求的问题。

我最终修复了json的回复:

overflow: visible;

 $this->getResponse()->setHeader('Content-type', 'application/json');

添加参数$this->getResponse()->setHeader('Content-type', true, 'application/json'); 将确保true方法搜索标头数组,并在设置第二个标头之前取消设置任何具有相同名称的标头。