Problem mit Fehlerseiten

  • Vielleicht weiß es ja einer und hat den Wink mit dem Pfahl....

    Früher ging das einfach mit PHP so:

    PHP
    <?php
    header ('HTTP/1.0 404 Not Found');
    echo 'Die persönliche Fehlermeldung';
    ?>

    Es erschien also der Text "Die persönliche Fehlermeldung" und die Seite hatte den Status 404.

    Nun seit FPM und Proxy habe ich ein großes Problem, denn der Code von oben geht nicht mehr. So bald da ein Header 404 kommt, wird der nachfolgende Output einfach ignoriert. Bedeutet also, es wird zwar der 404 gesendet, aber angezeigt wird nicht der individuelle Text, sondern die Default-Fehlerseite aus der ErrorDocument-Direktive.

    z.b. hier:ferien - netzwerk . de / test.php
    Dort ist genau der Code von oben hinterlegt und es wird nicht der Text angezeigt, sondern mein Default-ErrorDocument.

    Lasse ich ErrorDocument in den Apache-Einstellungen weg, dann kommt einfach ein "File not found".

    Das ist beides schlecht, denn ich benötige teilweise bestimmt Fehlerseiten, die anzeigen, warum der Fehler ausgelöst wurde. PHP muss also den Text ausgeben und den Header 404 senden.

    Ich schaffe es aber irgendwie nicht, den eigenen Text auf den Schirm zu bekommen und habe keine Ahnung, wo es hängt. An PHP? An Apache? Am Proxy?

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • Also dieser Proxy-FPM-Mist macht mich noch wahnsinnig. Da läuft ja gar nichts "normal".

    Hab den Code nun einfach mal umgedreht:

    <?php
    echo 'Die persönliche Fehlermeldung';
    header ('HTTP/1.0 404 Not Found');
    ?>

    Das lieferte bisher korrekterweise immer einen Fehler, weil der Header gesendet werden sollte, aber vorher schon andere Daten geschickt wurden. Seltsamerweise kommt dieser Fehler da auch nicht, der akzeptiert es. Er liefert auch hier einen 404, aber nicht meinen Text :fluch: Selbiges übrigens auch bei Header 401, 403 und 410, da kommen auch keine eigenen Texte mit..... Das ist doch alles Mist hoch drei....

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • ok, eben viel es mir auch auf, als ich 403 schrieb....

    Die Bottrap geht auch nicht! Die sperrt zwar, aber man kann nicht entsperren, weil die eigene Fehlerseite fehlt.... Kommt nur

    HTML
    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>403 Forbidden</title> </head><body> <h1>Forbidden</h1> <p>You don't have permission to access / on this server.<br /> </p> </body></html>

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • So, Fehler gefunden, wobei nicht wirklich den Fehler, aber was es verursacht... Ob das ein Bug ist??? Jedenfalls ist PHP-FPM in Verbindung mit Apache-Proxy ganz schön giftig. Hier scheint nginx besser zu sein, denn dort gibt es zwei Direktiven für die Fehlerbehandlung, beim Apache nur eine und die verursacht das Problem....

    Die persönliche eigene Fehlerseite, die ein Portal ausliefert, die kennt wohl jeder.... Um die bei FPM und Proxy zu aktivieren, also das ErrorDokument nutzbar zu machen, muss man die Direktive ProxyErrorOverride einschalten. Wenn die an ist, dann nutzt der Apache die unter ErrorDocument hinterlegte Datei und nicht einfach nur "File not found".

    Nun gehen die Probleme aber los, denn wenn ProxyErrorOverride aktiviert ist, dann wird der Response-Body von PHP bei allen Header von 400 und höher, also auch bei 5xx, nicht mehr beachtet. Der erscheint einfach nicht. Es kommt entweder die Meldung aus dem ErrorDokument oder, wenn nicht vorhanden, die Standardmeldung vom Apache.

    Es ist also nicht möglich, mit PHP einen Header 404 zu senden und einen Body dazu.

    Braucht man das, und das brauchen viele Scripte, dann muss man ProxyErrorOverride deaktivieren (Ich denke mal, das ist auch der Grund, warum es per Default aus ist). Dann kommt auch wieder der Body von PHP mit auf den Schirm. Das Problem hier dann aber, wenn ProxyErrorOverride aus ist, dann wird das ErrorDokument nicht mehr beachtet. Bei irgendwelchen Aufrufen, wo die Datei dann nicht gefunden werden kann, oder ein Header >= 400 kommt, aber kein Body, kommt nicht mehr die personalisierte Standard-Fehlermeldung vom ErrorDokument, sondern "File not found".

    Wie man es auch dreht und wendet, die Katze beißt sich in den Schwanz.

    So, also muss man für bestimmte Files das ProxyErrorOverride deaktivieren (z.B. für den Page-Restrictor) und dennoch global an lassen, z.B. mit so einem Konstrukt

    PHP
    ProxyErrorOverride On
    <Files "page.restrictor.php">
       ProxyErrorOverride Off
    </Files>


    Dann gehen die globalen Fehlerseiten und der Restrictor kann seine eigene Fehlermeldung schicken. Fertig? Nein!

    Es gibt ja auch noch andere Scripte, Funktionen und Klassen, die Fehlercodes und gleichzeitig Meldungen absetzen. Bei denen fehlen die Meldungen dann ja auch. Nur kann man die ja schlecht alle freigeben. Also muss man hier alles überarbeiten und die ganzen Error-Meldungen mit Status 400 oder größer in ein extra File als eigene Funktion auslagern und dieses dann inkluden und aufrufen, anstelle den Fehler "direkt vor Ort" zu erzeugen.

    Dann sind alle Fehlerheader und Meldungen, also alles was was größergleich 400 erzeugt und einen eigenen Body sendet, in einem File und das kann man dann auch "freigeben"

    PHP
    <Files "error_funktionen_mit_eigenem_body.php">
       ProxyErrorOverride Off
    </Files>


    Irgendwie ist das ganze FPM/Proxy-Gedöns ganz schön umständlich.

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(