Ошибка API Magento: прервано: ошибка синтаксического анализа заголовков: дублированный заголовок ‘Content-Type’

#magento #magento-1.4

#magento #magento-1.4

Вопрос:

Я только что обновил свой сервер до PHP 5.3 и быстрой CGI. К сожалению, это привело к тому, что magento api вернул странную ошибку

прервано: ошибка при разборе заголовков: дублированный заголовок ‘Content-Type’

Я пробовал различные предложения из Magento fourms, но безрезультатно.

Я использую версию 1.4.0.1. Есть предложения по устранению этой проблемы?

Ответ №1:

Из http://www.magentocommerce.com/boards/v/viewthread/229253 /

Редактировать

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

и замените функцию sendHeaders() следующим кодом
(Вы не должны переопределять основные классы, но это заставит его работать. С использованием приложения / 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]) amp;amp; $sent[$name]) {
                    unset($this->_headersRaw[$i]);
                    continue;
                }

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

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

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

    parent::sendHeaders();
}
  

Ответ №2:

Какой веб-сервер вы используете?

Проверьте, настроен ли ваш Apache / nginx — fcgi на отправку этого заголовка по умолчанию.

Ответ №3:

Попробуйте это — удалить по имени

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

и добавьте свой заголовок

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

Ответ №4:

Я видел несколько сайтов, у которых возникли проблемы с Magento и fcgi. Обычно потому, что fast cgi настроен на отправку заголовка по умолчанию. Однако проблема не возникает с mod_php. Большую часть времени я сталкивался с проблемой с запросом Ajax.

В итоге я исправил ответ json:

От

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

Для

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

Добавление параметра true гарантирует, что setHeader() метод выполнит поиск в массиве заголовков и отменит все заголовки с тем же именем, прежде чем установить второй заголовок.