Bei der aktuellen Magento Version gibt es ein Problem wenn PHP als (Fast-)CGI läuft. Da CGI keine doppelten Status- oder Content-Type-Header akzeptiert, steigt der Server in dem Fall mit einem “500 Server Error” aus.
Der Bug wurde eigentlich schon längst behoben, aber leider hat der Fix noch nicht seinen Weg in den aktuellen Magento Core gefunden.
Das Problem liegt in der Datei app/code/core/Mage/Core/Controller/Response/Http.php. Dort wurde bereits versucht, diesen Sonderfall abzufangen, doch leider scheint der verantwortliche Programmierer nicht gewusst zu haben, daß dieser Fehler sowohl bei “Status”, “Http” als auch bei “Content-Type” auftritt. Dieser Fix behebt folgende Fehler:
- FastCGI: comm with server aborted: error parsing headers: duplicate header ‘Content-Type’
- FastCGI: comm with server aborted: error parsing headers: duplicate header ‘Status’
- SOAP-ERROR: Parsing WSDL: Couldn’t load from ‘http://www.magento.com/api/index/index/wsdl/1/’
Letzterer ist schwer zu entlarven, da intern die wsdl-Datei für die Webservice-Anbindung geladen wird, dabei aber nur o.g. Fehler zurückkommt – dieser ist in Wirklichkeit aber ein Fehler aufgrund eines doppelten Content-Type Headers.
Hier also die komplette Funktion sendHeaders() mit meinem Fix für Status, HTTP und Content-Type Header:
/**
* Fixes CGI only one Status + Content Type header allowed bug
*
* @link http://bugs.php.net/bug.php?id=36705
* @link http://www.magentocommerce.com/bug-tracking/issue/?issue=1257
*
*/
public function sendHeaders()
{
if (!$this->canSendHeaders()) {
Mage::log('HEADERS ALREADY SENT: '.mageDebugBacktrace(true, true, true));
return $this;
}
if (substr(php_sapi_name(), 0, 3) == 'cgi') {
$statusSent = FALSE;
$contentSent = FALSE;
foreach ($this->_headersRaw as $i=>$header) {
if (stripos($header, 'status:')===0 || stripos($header, 'http/1.1')===0) {
if ($statusSent) {
unset($this->_headersRaw[$i]);
} else {
$statusSent = true;
}
}
if (stripos($header, 'content-type')===0) {
if ($contentSent) {
unset($this->_headersRaw[$i]);
} else {
$contentSent = true;
}
}
}
foreach ($this->_headers as $i=>$header) {
if (strcasecmp($header['name'], 'status')===0 || strcasecmp($header['name'], 'Http/1.1')===0) {
if ($statusSent) {
unset($this->_headers[$i]);
} else {
$statusSent = true;
}
}
if (strcasecmp($header['name'], 'content-type')===0) {
if ($contentSent) {
unset($this->_headers[$i]);
} else {
$contentSent = true;
}
}
}
}
parent::sendHeaders();
}
Ich hoffe das hilft einigen bis der Fix endlich in den Core gewandert ist.
[...] comunidad, novalis, nos facilita el código para solucionar el problema además de remitirnos a su blog donde amplia la explicación, en alemán. Cómo novalis comenta la función a modificar es [...]
DANKE habe lange danach gesucht….
am schluss hat es ein ) zu viel drin sonst perfekt…
Jaaa geil, hast mir grad mein Arsch gerettet, Feeds rennen wieder, thx man =)