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?

Antworten:


25

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


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


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


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

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.


4

.htaccess

ErrorDocument 403     /403.html

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.


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');

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.


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.


-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>

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.