Hugo Egon Balder: Ist eine einzelne php Ressource für alle Fehlerseiten möglich?

Hallo Forum!

Ich habe bisher die Ausgabe meine eigenen Fehlerseiten mittels .htaccess folgendermassen geregelt:

ErrorDocument 401 /fehler/401_fehler.php
ErrorDocument 403 /fehler/403_fehler.php
ErrorDocument 404 /fehler/404_fehler.php
u.s.w.

Und dazu dann für jede http Statusmeldung eine egene php Ressource.

Jetzt frage ich mich gerade, ob man das nicht eleganter lösen kann und den vom Server kommenden Statuscode auslesen und entsprechend _mit einer einzigen_ php Ressource verarbeiten kann.

Also so:

ErrorDocument 401 /fehler/fehler.php
ErrorDocument 403 /fehler/fehler.php
ErrorDocument 404 /fehler/fehler.php
u.s.w.

Und innerhalb von fehler.php eine Abfrage nach dem http Statuscode und mittels if-Schleife oder case-Anweisung eine entsprechende Fehlermeldungsausgabe.

Kann man das technisch realisieren und wenn ja, mit welcher php-Funktion? Oder ist das technisch gar nicht möglich und ich _muss_ für jeden http Statuscode eine eigene Fehlermeldungs-Seite schreiben? Meine Google-Suche hat mir leider keine brauchbare Antwort geliefert.

Danke für jede Hilfe!

MfG

Hugo Egon Balder

  1. ErrorDocument 401 /fehler/fehler.php
    ErrorDocument 403 /fehler/fehler.php
    ErrorDocument 404 /fehler/fehler.php
    u.s.w.

    Und innerhalb von fehler.php eine Abfrage nach dem http Statuscode und

    Kann man das technisch realisieren und wenn ja, mit welcher php-Funktion?

    Sei mutig, sei erfinderisch, probiere es aus. Erstelle, neben obigen ErrorDocument-Einträgen, das Skript fehler.php mit diesem Inhalt:

    <?php
    phpinfo(INFO_VARIABLES);
    ?>

  2. Tach!

    Und innerhalb von fehler.php eine Abfrage nach dem http Statuscode und mittels if-Schleife oder case-Anweisung eine entsprechende Fehlermeldungsausgabe.

    if-was?

    Kann man das technisch realisieren und wenn ja, mit welcher php-Funktion? Oder ist das technisch gar nicht möglich und ich _muss_ für jeden http Statuscode eine eigene Fehlermeldungs-Seite schreiben?

    Alle Informationen, die PHP auslesen kann, stehen in $_GET, $_POST, $_SERVER, $_ENV. Der Apache ruft das ErrorDocument nicht per POST auf, auch nicht, wenn es ein POST-Request seitens des Client war. $_POST ist hier also unbrauchbar. In $_GET jedoch kannst du was finden, wenn du dein ErrorDocument mit einem Querystring angibst. Aber du findest auch in $_SERVER (oder zur Not $_ENV) alle Informationen zum fehlerhaften Request.

    dedlfix.

    1. Tach!

      Und innerhalb von fehler.php eine Abfrage nach dem http Statuscode und mittels if-Schleife oder case-Anweisung eine entsprechende Fehlermeldungsausgabe.

      if-was?

      if-sowas!

      Gruß
      Kalk

  3. @@Hugo Egon Balder:

    nuqneH

    Und innerhalb von fehler.php eine Abfrage nach dem http Statuscode

    Dafür dürfte es zu spät sein. fehler.php musst du den Status des vorigen(!) Requests schon von außen mitteilen, bspw. per GET-Parameter:

    ErrorDocument 401 /fehler/fehler.php?status=401

    und mittels if-Schleife

    Und damit schon gar nicht.

    Qapla'

    --
    „Perfektion ist nicht dann erreicht, wenn es nichts mehr hinzuzufügen gibt, sondern wenn man nichts mehr weglassen kann.“ (Antoine de Saint-Exupéry)
    1. @@Gunnar Bittersmann:

      nuqneH

      Dafür dürfte es zu spät sein. fehler.php musst du den Status des vorigen(!) Requests schon von außen mitteilen

      Quatsch. Wie dedlfix sagte, steht der Statuscode innerhalb von fehler.php zur Verfügung.

      Qapla'

      --
      „Perfektion ist nicht dann erreicht, wenn es nichts mehr hinzuzufügen gibt, sondern wenn man nichts mehr weglassen kann.“ (Antoine de Saint-Exupéry)
  4. مرحبا

    ErrorDocument 401 /fehler/fehler.php
    ErrorDocument 403 /fehler/fehler.php
    ErrorDocument 404 /fehler/fehler.php

    Ich hab's in meinem CMS so gelöst (alles erstmal auf die index.php umleiten):

    # .htaccess  
    ErrorDocument 401 /index.php?error_document=401  
    ErrorDocument 403 /index.php?error_document=403  
    ErrorDocument 404 /index.php?error_document=404
    
    <?php  
      
    # Hier könnte man sich evtl. was neues einfallen lassen  
    $_SERVER_ERROR = false;  
    if (isset($_GET['error_document'])) { # per htaccess erzeugte Fehlerseiten abfangen  
      switch($_GET['error_document']) {  
        case '401':  
          $_SERVER_ERROR = 401;  
        break;  
        case '403':  
          $_SERVER_ERROR = 403;  
        break;  
        case '404':  
          $_SERVER_ERROR = 404;  
        break;  
      }  
    }
    

    mfg

  5. Ich möchte mich herzlich für die Denkanstöße bedanken!

    Das, wonach ich gesucht hatte, war der Index 'REDIRECT_STATUS' des $_SERVER Arrays.

    Und genau das war auch der Grund, wieso mir das php Manual heute keine Hilfe war, da nämlich der Index 'REDIRECT_STATUS' im Manual nicht bei all den anderen Indices dabei steht. Deshalb kam ich vorher auch auf keine Lösung.

    Erst wenn man auf der Manualseite weiter runter scrollt, findet man im Kommentarbereich den Eintrag "MarkAgius at markagius dot co dot uk 30-Aug-2011 07:18". Dort steht richtigerweise:"You have missed 'REDIRECT_STATUS', very useful if you point all your error pages to the same file."

    Und darunter steht genau das, was ich gemeint hatte.

    In die .htaccess kommt:

    ErrorDocument 404 /fehlermeldung.php
    ErrorDocument 500 /fehlermeldung.php
    ErrorDocument 400 /fehlermeldung.php
    ErrorDocument 401 /fehlermeldung.php
    ErrorDocument 403 /fehlermeldung.php
    u.s.w.

    In der fehlermeldung.php steht dann für die Weiterverarbeitung:

    $HttpStatus=$_SERVER["REDIRECT_STATUS"];
    if($HttpStatus==400){$fehlermeldung="Die Anfrage-Nachricht war fehlerhaft aufgebaut.";}
    if($HttpStatus==401){$fehlermeldung="Die Anfrage kann nicht ohne gültige Authentifizierung durchgeführt werden.";}
    if($HttpStatus==403){$fehlermeldung="Die Anfrage wurde mangels Berechtigung des Clients nicht durchgeführt.";}
    if($HttpStatus==500){$fehlermeldung="Dies ist ein „Sammel-Statuscode“ für unerwartete Serverfehler.";}
    u.s.w.

    Danke für die Antworten! Mein Problem ist somit gelöst! (Lösung getestet und es funktioniert wie gewünscht!)

    MfG

    Hugo Egon Balder

    PS: Eines möchte ich noch anmerken: Selbstverständlich mache ich mit "if" eine Abfrage und keine Schleife. Das habe ich beim schnellen Schreiben falsch formuliert. Ich bin allerdings der Meinung, dass wenn man mich schon darauf aufmerksam macht, ein schlichter Hinweis in Form eines "Mit IF werden Abfragen gemacht, keine Schleifen!" besser, lehrreicher und vor allem freundlicher und nicht so oberlehrerhaft wie ein "if-was?" ist. Würde ich nämlich nicht von selbst wissen, was ich da falsch formuliert habe, ist ein "if-was?" keine große Hilfe. Aber danke trotzdem für den Hinweis!

    1. @@Hugo Egon Balder:

      nuqneH

      $HttpStatus=$_SERVER["REDIRECT_STATUS"];

      Das Umkopieren ist wohl nicht sinnvoll.

      if($HttpStatus==400){$fehlermeldung="Die Anfrage-Nachricht war fehlerhaft aufgebaut.";}
      if($HttpStatus==401){$fehlermeldung="Die Anfrage kann nicht ohne gültige Authentifizierung durchgeführt werden.";}

      Sinnvoll wäre hier aber ein switch statt der vielen if:

      switch ($_SERVER['REDIRECT_STATUS'])  
      {  
        case 400: $fehlermeldung="Die Anfrage-Nachricht war fehlerhaft aufgebaut."; break;  
        case 401: $fehlermeldung="Die Anfrage kann nicht ohne gültige Authentifizierung durchgeführt werden."; break;  
        // …  
      }
      

      Qapla'

      --
      „Perfektion ist nicht dann erreicht, wenn es nichts mehr hinzuzufügen gibt, sondern wenn man nichts mehr weglassen kann.“ (Antoine de Saint-Exupéry)
      1. Hallo Gunnar!

        $HttpStatus=$_SERVER["REDIRECT_STATUS"];
        Das Umkopieren ist wohl nicht sinnvoll.

        Auch wieder wahr. *kopfkratz*

        Sinnvoll wäre hier aber ein switch statt der vielen if

        Stimmt. Das finde ich auch sympathischer. Und genau so werde ich es jetzt auch umsetzen.

        MfG

        Hugo Egon Balder

      2. Tach!

        if($HttpStatus==400){$fehlermeldung="Die Anfrage-Nachricht war fehlerhaft aufgebaut.";}
        if($HttpStatus==401){$fehlermeldung="Die Anfrage kann nicht ohne gültige Authentifizierung durchgeführt werden.";}
        Sinnvoll wäre hier aber ein switch statt der vielen if:

        Ein Array mit den Fehlercodes als Schlüssel und den Meldungstexten als Werten benötigt die geringste Schreibarbeit bei der Datenhaltung. Selbst das Abfragen/Ausgeben dazugenommen ist immer noch kürzer als die Viele-ifs- oder Ein-switch-Lösungen: wenn fehlermeldungen[fehlercode] vorhanden ist, dann ausgeben, ansonsten eine alternative Meldung ausgeben.

        dedlfix.

    2. Und genau das war auch der Grund, wieso mir das php Manual heute keine Hilfe war, da nämlich der Index 'REDIRECT_STATUS' im Manual nicht bei all den anderen Indices dabei steht. Deshalb kam ich vorher auch auf keine Lösung.

      Die Daten stammen vom Webserver an sich, nicht von PHP. Insofern rate ich dir, besser selbst nachzuschauen als dich auf die PHP-Anleitung zu verlassen.

      $HttpStatus=$_SERVER["REDIRECT_STATUS"];
      if($HttpStatus==400){$fehlermeldung="Die Anfrage-Nachricht war fehlerhaft aufgebaut.";}
      if($HttpStatus==401){$fehlermeldung="Die Anfrage kann nicht ohne gültige Authentifizierung durchgeführt werden.";}

      Schreib's doch lieber so:

      if ($_SERVER["REDIRECT_STATUS"] == 400) {
          $fehlermeldung = "Die Anfrage-Nachricht war fehlerhaft aufgebaut.";
      }
      else if ($_SERVER["REDIRECT_STATUS"] == 401) {
          $fehlermeldung = "Die Anfrage kann nicht ohne gültige Authentifizierung durchgeführt werden.";
      }
      else if usw.

      Du hast weder einen Vorteil davon, eine separate Variable mit dem Status zu füllen, noch von etlichen Einzelkämper-if-Abfragen, obwohl von vornherein klar ist, dass sie zusammengehören und nur eine davon zutreffen kann. Statt eines Vorteils hast du nur den Nachteil der verringerten Übersichtlichkeit.
      Und es ist davon abgesehen auch nicht so, dass mit dem Einsparen von Leerzeichen und Zeilen das Weltklima gerettet wird.

      Von Gunnars switch würde ich im Übrigen ebenfalls abraten, denn auf dessen Heimtücke, die so notwendige wie unscheinbare break-Anweisung, ist schon so mancher reingefallen.

      ein schlichter Hinweis in Form eines "Mit IF werden Abfragen gemacht, keine Schleifen!" besser, lehrreicher

      Also wenn wir schon dabei sind: Mit if werden genauso Abfragen gemacht wie mit while. Hier geht's um if-Block und while-Schleife.

      vor allem freundlicher und nicht so oberlehrerhaft wie ein "if-was?"

      Richtig, aber die if-Schleife tut manchen im Geiste so weh wie anderen eine Wurzelbehandlung am Zahn. Sieh es ihnen nach.

      1. Von Gunnars switch würde ich im Übrigen ebenfalls abraten, denn auf dessen Heimtücke, die so notwendige wie unscheinbare break-Anweisung, ist schon so mancher reingefallen.

        Und du glaubst wirklich, dass jemand, der ein break; vergisst, in der Lage ist, diesen Spagetti-Code fehlerfrei umzusetzen?