
Jemand in meinem Studio hat vor einigen Jahren eine Webseite entworfen und nun hat der Kunde beschlossen, den Server zu wechseln (er ist auf einen Linux Apache-Server mit Gen2 SMP, 64 Bit, PHP Version 5.3.8, Standard MYSQL Version 5 umgestiegen). Plötzlich fing der Server an, seltsame Dinge zu tun.
Wenn Sie auf einen Link klicken, der eine Anmeldung erfordert, werden Sie mithilfe einer PHP-Funktion auf die Anmeldeseite weitergeleitet header()
. Interessanterweise wird auf der Seite Folgendes angezeigt:
OK
Der Server hat einen internen Fehler oder eine Fehlkonfiguration festgestellt und konnte Ihre Anfrage nicht abschließen. Wenden Sie sich bitte an den Serveradministrator [keine Adresse angegeben] und teilen Sie ihm mit, wann der Fehler aufgetreten ist und was Sie möglicherweise getan haben, das den Fehler verursacht haben könnte. Weitere Informationen zu diesem Fehler finden Sie möglicherweise im Server-Fehlerprotokoll. HTTP/1.1 200 OK Datum: Montag, 15. Oktober 2012 17:27:32 GMT Server: Apache/2.2.22 (Unix) FrontPage/5.0.2.2635 X-Powered-By: PHP/5.3.8 Läuft ab: Donnerstag, 19. November 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Keep-Alive: timeout=5, max=399 Verbindung: Keep-Alive Transfer-Encoding: chunked Content-Type: text/html 232c
Dann die Seite selbst und dann eine weitere Überschrift:
0 1f4
OK
Der Server hat einen internen Fehler oder eine Fehlkonfiguration festgestellt und konnte Ihre Anfrage nicht abschließen. Bitte wenden Sie sich an den Serveradministrator [keine Adresse angegeben] und teilen Sie ihm mit, wann der Fehler aufgetreten ist und was Sie möglicherweise getan haben, das den Fehler verursacht haben könnte. Weitere Informationen zu diesem Fehler finden Sie möglicherweise im Server-Fehlerprotokoll. 0
Am interessantesten ist, dass die Seite korrekt geladen wird, wenn Sie sie aktualisieren oder die URL mit der Eingabetaste betätigen. Ich habe die Protokolle überprüft und es wird nur ein nicht vorhandenes Favicon angezeigt. Ich habe auch die .htaccess überprüft, alles war korrekt (RewriteBase war / wie vorgesehen, und das einzige, was es gibt, ist eine weitere Regel, die ^en/-Anfragen in request?lang=en verschiebt. Hat jemand schon einmal so etwas erlebt?
Bearbeiten: Der IE löst diese beiden Header nicht aus. Das wird immer seltsamer.
Die Lösung!: Wie @adaptr anmerkte, war es eine Frage von PHP und nicht von irgendetwas Serverbezogenem. Der letzte Programmierer (ich weiß, es ist nicht höflich, dem Vorgänger die Schuld zu geben, aber diese Situation hat mich zu viel Zeit gekostet) hat Folgendes gemacht:
/* config.php -> included everywhere as a bootstrap*/
// ... constant/mysql setup
if($notLogged)
{
$forward = ...;//previous url
header("Location: ".WWW.LANG."/customer-area/login/index.php?forward=".$forward);
exit;
}
Bei genauerem Hinsehen ist mir etwas durch den Kopf gegangen: exit;
Würden die Header richtig gesendet oder nicht? Natürlich exit;
würde das Entfernen dieses Aufrufs die Seite weiter ausführen (ich weiß, dass das überhaupt nicht richtig ist, deshalb habe ich es vorher nicht probiert). Wenn die Header jedoch nicht vollständig gesendet würden, könnte das zu Problemen führen (ich bin kein Server-Typ, da bin ich mir nicht sicher, tut mir leid, Leute). Nachdem ich diesen exit;
Aufruf entfernt hatte, wurde die Seite richtig erstellt, die Header wurden „geschlossen“ (aufgrund des Ausgabestarts) und alle Zahnräder begannen sich wieder zu bewegen. Vielen Dank an alle, Leute, beste Prämie von 100 Punkten =)
Antwort1
Wenn die Apache-Protokolle keine Fehler anzeigen, bedeutet dies, dass PHP dies alles verarbeitet hat – und auch die seltsamen Antworten an den Client zurückgegeben hat.
Aktivieren Sie die ordnungsgemäße PHP-Protokollierung und untersuchen Sie, was es bewirkt.
Dieses Bit in der Antwort ist aussagekräftig:
Übertragungskodierung: chunked
Das bedeutet, dass PHP die Antwort in einem (Text/HTML)-Stream sendet, derhat keine Inhaltsgröße definiertin den Kopfzeilen.
Dies kann dazu führen, dass bei der Header-Ausgabe (die von PHP häufig zwischengespeichert wird, d. h. in der falschen Reihenfolge generiert wird) auch nur der kleinste Fehler auftritt und der Client so denkt, es würde eine neue Seite gesendet.
Dies ist nur einer der möglichen Gründe. Eine ordnungsgemäße PHP-Protokollierung verrät Ihnen mehr.
Antwort2
Sie müssen den Seitencode debuggen, anstatt den Server nach der Ursache zu durchsuchen. Aus Ihrem Beitrag erkenne ich, dass er mit FrontPage erstellt wurde (wirklich, hat das ein Profi verwendet?), sodass er zwangsläufig Code enthält, der auf einer Nicht-Microsoft-Plattform nicht richtig funktioniert. Korrigieren Sie den Code, indem Sie den gesamten Microsoft-spezifischen Code entfernen, und er wird möglicherweise ordnungsgemäß ausgeführt.