Ich habe eine PHP (PHP 5.3.2) -Anwendung, die unter Apache (2.2.14) auf einem Linux-Server läuft. Mehr als einmal in seiner Geschichte begann Benutzer in ihren Browsern die folgende Nachricht zu sehen: "Request Entity zu groß". Erste Google-Suche vorgeschlagen, dass es passiert, wenn eine hochgeladene Datei zu groß ist oder wenn Cookies zu groß sind. Aber es passiert nicht beim Datei-Upload, nur beim Login und immer auf der Login-Seite. Der Benutzer gibt diese Seite nur über ein normales POST-Formular auf einer Seite ein. Und die Cookies enthalten nur die Sitzungs-ID.
Darüber hinaus protokolliert Apache "ungültige Inhaltslänge". Dies wird protokolliert, bevor einer meiner Code ausgeführt wird. $ _POST ist leer obwohl es einige Daten enthalten sollte. Als ich die folgende Zeile hinzugefügt habe:
%Vor%es sagt
%Vor%scheint tatsächlich ungültig zu sein. Das Ändern des Browsers oder das Zurücksetzen des Benutzer-PCs scheint nicht zu helfen. Am nächsten Tag fing alles an zu arbeiten.
Wo kann das Problem liegen? Ist es etwas mit Apache, PHP, Netzwerkeinstellungen des Benutzers? Wenn ich weitere Informationen hinzufügen muss, lassen Sie es mich wissen.
In den letzten Tagen sind Meldungen über "ungültige Inhaltslänge" aufgetreten, die von Apache in error_log protokolliert wurden. Verfolgte das Problem bei einem Besucher aus nur wenigen spezifischen IP-Klassen, z. B. Movistar Argentina: 200.81.44.201 Weitere Überprüfung der Anfrage mit tcpdump / whireshark haben wir beobachtet, dass die POST-Anfrage enthielt
doppelte Header, nämlich Content-Length und Content-Type
Das eigentliche Problem ist bei Content-Length, weil Apache mehrere Variablen behandelt, indem sie sie verkettet, zum Beispiel:
%Vor%Das Ergebnis wird sein:
%Vor%Apache versucht dann, die Zeichenfolge "51, 51" in eine Ganzzahl zu konvertieren, die nicht möglich ist. In neueren Apache & gt; 2.2.17, oder mit rückportierten Patches Apache protokolliert einen Fehler: 413 Request Entity Too Large, mit älterem Apache, verbraucht der Prozess nur sehr viel CPU-Zeit. Hinter dieser IP-Klasse sehen wir mehr unterschiedliche Clients, daher sind sie möglicherweise falsch konfigurierte 3G-Gateway-Proxy-Server, da sie diese Header duplizieren. So finden wir eine Lösung, um Apache so zu konfigurieren, dass die Anfrage mit nur einem Content-Length und einem Content-Type Header neu geschrieben wird: Hier ist mein Code dafür, mit mod_headers, und SetEnvIfNoCase eingefügt in httpd.conf:
%Vor%Sie können diesen Code testen und verwenden, um doppelte Content-Length-HTTP-Header-Variablen herauszufiltern.
Der einfachste Weg, solche Probleme zu untersuchen, besteht darin, TCPDump zu verwenden, um die Pakete zu erfassen, die zwischen dem Client und dem Server gesendet werden Datei, und verwenden Sie dann Wireshark , um die Pakete als TCP-Stream anzuzeigen.
Ein Beispiel für den Befehl zum Erfassen der Pakete wäre.
tcpdump -vvv -A -i eth0 'Host 123.123.10.12 & amp; & amp; Port 80 '-w eth0.dat
Da es Ihre Anmeldeseite ist, müssen Sie wahrscheinlich den TCP-Datenstrom entschlüsseln, wie er hinter HTTPS sein sollte. Dies kann mit den Anweisungen von Ссылка
Plasmid87 ist fast sicher korrekt - es hört sich an, als ob einer der Header gerade massiv anwächst und schließlich größer wird als die Apache LimitRequestFieldSize.
Solange es langsam und nicht auf einmal wächst, können Sie es untersuchen, indem Sie die globalen Variablen überprüfen.
%Vor%