#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()
метод выполнит поиск в массиве заголовков и отменит все заголовки с тем же именем, прежде чем установить второй заголовок.