Ist eine einzelne php Ressource für alle Fehlerseiten möglich?
Hugo Egon Balder
- webserver
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
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);
?>
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.
Tach!
Und innerhalb von fehler.php eine Abfrage nach dem http Statuscode und mittels if-Schleife oder case-Anweisung eine entsprechende Fehlermeldungsausgabe.
if-was?
Gruß
Kalk
@@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'
@@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'
مرحبا
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
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!
@@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'
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 vielenif
Stimmt. Das finde ich auch sympathischer. Und genau so werde ich es jetzt auch umsetzen.
MfG
Hugo Egon Balder
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 einswitch
statt der vielenif
:
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.
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.
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?