Emulieren Sie eine 403-Fehlerseite

70

Ich weiß, dass Sie einen Header senden können, der dem Browser mitteilt, dass diese Seite verboten ist, wie:

header('HTTP/1.0 403 Forbidden');

Aber wie kann ich auch die benutzerdefinierte Fehlerseite anzeigen, die auf dem Server für diese Art von Fehler erstellt wurde?

Standardmäßig wird beim Senden des Headers nur eine weiße Seite angezeigt, aber ich erinnere mich, dass Sie vor einiger Zeit gelesen haben, dass Sie die Kundenfehlerseite verwenden können. Weiß das jemand?

NightHawk
quelle

Antworten:

25

Fügen Sie die benutzerdefinierte Fehlerseite nach dem Ändern des Headers ein.

Ibrahim AshShohail
quelle
Ich habe das auch versucht, aber solche Dinge werden nicht gerendert: <! - # echo var = "REDIRECT_STATUS" ->
NightHawk
Nachdem ich viel mehr gesucht und nichts anderes gefunden hatte, entschied ich mich, die Seite einzuschließen und die SSI-Befehle einfach mit PHP auszutauschen.
NightHawk
2
Ryan, das klingt richtig - um serverseitige Includes zum Laufen zu bringen, müssten Sie Apache erneut anrufen, um zu sagen: "Vergiss nicht, diene dieser Anfrage nicht als PHP, diene stattdessen 'dieser Seite'" - oder (in einer Simulation dieses Verhaltens) Proxying Ihrer eigenen Site durch Anfordern dieser 403-Seite und Zurücksenden der Ausgabe als Antwort der ursprünglichen Anforderung.
Alan H.
63

Geben Sie einfach Ihren Inhalt nach dem Senden des Headers wieder.

header('HTTP/1.0 403 Forbidden');

echo 'You are forbidden!';

verboten

Alex
quelle
4
Ich weiß, dass ich das kann, aber wie verwende ich die benutzerdefinierte Fehlervorlage, die bereits eingerichtet ist?
NightHawk
3
@ Ryan Hängt ganz davon ab, wie Ihre Anwendung eingerichtet ist. Es kann möglich sein, es einfach einzuschließen. Senden Sie keinen LocationHeader, da dies den Antwortcode ändert.
alex
51

http_response_code wurde in PHP 5.4 eingeführt und hat die Sache viel einfacher gemacht!

http_response_code(403);
die('Forbidden');
Marcio Mazzucato
quelle
20

Dazu müssen Sie zunächst für den Browser angeben, dass der Benutzer einen Fehler 403 erhalten hat. Hierzu können Sie folgenden Code verwenden:

header("HTTP/1.1 403 Forbidden" );

Dann sendet das Skript "Fehler, Fehler, Fehler, Fehler, Fehler .......", sodass Sie es stoppen müssen. Sie können verwenden

exit;

Mit diesen beiden Zeilen sendet der Server einen Fehler und stoppt das Skript.

Vergessen Sie nicht: das emuliert den Fehler, aber Sie müssen ihn in einer .htaccess-Datei mit setzen

ErrorDocument 403 /error403.php
Pyrrha
quelle
8

Viele der Antworten gesehen, aber die richtige ist, die vollständigen Optionen für den Header-Funktionsaufruf gemäß dem PHP-Handbuch bereitzustellen

void header ( string $string [, bool $replace = true [, int $http_response_code ]] )

Wenn Sie mit aufrufen

header('HTTP/1.0 403 Forbidden', true, 403);

Das normale Verhalten von HTTP 403, wie es mit Apache oder einem anderen Server konfiguriert wurde, würde folgen.

Jiju Thomas Mathew
quelle
4

.htaccess

ErrorDocument 403     /403.html

quelle
1
Tippfehler, es passiert, (ich hatte 404 und 403.html)
Wird Apache die Fehlerseite auch dann direkt anzeigen, wenn der Benutzer den Header geändert hat? Ich weiß nicht, warum das nicht funktioniert, aber ich frage mich nur ...
Ibrahim AshShohail
@alex, sorry, aber das passiert manchmal
Die Jungs hier scheinen zu glauben, dass es nicht möglich ist, Apache die Anfrage bearbeiten zu lassen, wenn Sie den Header geändert haben: stackoverflow.com/questions/1501094/…
Ibrahim AshShohail
@Ibrahim AshShohail Benutzer ändert den Header wie? Der Header wird vom Server generiert.
4

Ich habe alle Antworten hier gelesen und keine von ihnen war eine vollständige Antwort auf meine Situation (die in dieser Frage genau gleich ist). Deshalb habe ich hier einige Teile der vorgeschlagenen Antworten gesammelt und die genaue Lösung gefunden:

  1. Landen Sie auf der echten 403-Seite Ihres Servers. (Gehen Sie zu einer verbotenen URL auf Ihrem Server oder zu einer beliebigen 403-Seite.)
  2. Klicken Sie mit der rechten Maustaste und wählen Sie "Quelle anzeigen". Wählen Sie alle Quellen aus und speichern Sie sie in einer Datei auf Ihrer Domain wie folgt: http://domain.com/403.html
  3. Gehen Sie jetzt zu Ihrer wirklich verbotenen Seite (oder einer verbotenen Situation in einem Teil Ihres PHP). Beispiel: http://domain.com/members/this_is_forbidden.php
  4. Echo diesen Code vor jeder HTML-Ausgabe oder Header! (Selbst ein Leerzeichen führt dazu, dass PHP HTML / TEXT-HTTP-Header sendet und dies nicht funktioniert.) Der folgende Code sollte Ihre erste Zeile sein !

        <?php header('HTTP/1.0 403 Forbidden');
        $contents = file_get_contents('/home/your_account/public_html/domain.com/403.html', TRUE);
        exit($contents);
    

Jetzt haben Sie die genaue Lösung. Ich habe mit CPANEL Latest Visitors überprüft und verifiziert, und es ist als genaues 403-Ereignis registriert.

Tarik
quelle
Ich kann mich irren, aber ich würde sagen, es druckt nur die PHP von /home/your_account/public_html/domain.com/403.php. Es führt es nicht aus.
Pierre-Olivier Vares
@ Pierre-OlivierVares Ja, es wird nicht ausgeführt, aber es ist bereits eine statische Datei. Warum sollten Sie es ausführen? Wenn Sie die enthaltene Datei weiterhin ausführen möchten, verwenden Sie include ("/home/your_account/public_html/domain.com/403.php"). stattdessen.
Tarik
1
Warum sollte es unbedingt eine statische Datei sein? Sie selbst haben (vor dem Bearbeiten Ihres Kommentars) '.php' als Erweiterung geschrieben, und das OP fragt in seinen Kommentaren nach SSI. Wenn es sich um eine HTML-Datei handelt, können Sie sie natürlich einfach wiederholen. Wenn es sich um eine .php-Datei handelt, wird davon ausgegangen, dass sie dynamisch ist. Sie können sie daher nur dann wiederholen, wenn Sie den Quellcode explizit möchten.
Pierre-Olivier Vares
Ich konnte nicht mit .htaccess ErrorDocument arbeiten und scheint die einzige Lösung zu sein, die mit der PHP-Header-Funktion funktioniert. Ich empfehle, den Header in eine Funktion wie z. B. function error403 () {// alle Codes von @tarik} einzufügen und auf den benötigten Seiten einfach error403 () aufzurufen.
Jemand Besonderes
2

Um die Leistung des Servers zu minimieren, machen Sie es einfach:

.htaccess

ErrorDocument 403 "Forbidden"

PHP

header('HTTP/1.0 403 Forbidden');

die(); // or your message: die('Forbidden');
virtual_cia
quelle
2

Verwenden Sie ModRewrite:

RewriteRule ^403.html$ - [F]

Stellen Sie einfach sicher, dass Sie ein leeres Dokument mit dem Namen "403.html" in Ihrem WWW-Stammverzeichnis erstellen. Andernfalls wird anstelle von 403 ein 404-Fehler angezeigt.

Jay Sudo
quelle
Hmm, es funktioniert irgendwie. Ich habe es versucht, aber die Variable REQUEST_URI wird anstelle der Ressource, die Sie einschränken möchten, auf /403.html gesetzt. Dies kann für Benutzer verwirrend sein.
Jay Sudo
Nun, du musst damit spielen. ModRewrite ist unglaublich leistungsfähig und definitiv die Lösung für Ihr Problem.
Jay Sudo
1

Ich verstehe, dass Sie ein Szenario mit ErrorDocument bereits in Ihrem Apache conf oder .htaccess definiert haben und diese Seiten anzeigen möchten, wenn Sie manuell einen 4xx-Statuscode über PHP senden.

Leider ist dies mit gängigen Methoden nicht möglich, da PHP den Header direkt an den Browser des Benutzers sendet (nicht an den Apache-Webserver), während ErrorDocument ein Display-Handler für den von Apache generierten http-Status ist.

labemi
quelle
-1

Aktualisieren Sie die Seite nach dem Senden des 403:

<?php 
header('HTTP/1.0 403 Forbidden');
?>
<html><head>
<meta http-equiv="refresh" content="0;URL=http://my.error.page">
</head><body></body></html>
Richard
quelle
1
Ich sehe dies nicht als eine sehr gute Lösung. Warum senden Sie nicht einfach einen Standort-Header, wenn Sie dies erreichen möchten?
Alex