PHP [GELÖST] Eigene 404-Seite mit logging der URL?

BartTheDevil89

Devilution Media
ID: 87739
L
2 Mai 2006
3.960
103
Hallo,

ich würde gern eine eigene 404-Seite aufsetzen, die gleichzeitig auch noch in einem log schreibt, welche URL versucht wurde.
Das habe ich schon:

.htaccess
Code:
ErrorDocument 404 error.php?error=404

error.php
PHP:
echo "Fehler $_GET[error]";
echo "Sie haben versucht folgende URL aufzurufen: ???";

Mein Problem sind die ??? - wie komme ich an die URL, die versucht wurde aufzurufen? Denn "REQUEST_URI" hilft mir ja leider nicht, da bekomme ich ja meine error.php heraus. Und referer ist ja ebenfalls keine sichere Quelle.

Also wie komme ich am besten umd sichersten an die URL, die aufgerufen wurde?

Danke;)
 
Zuletzt bearbeitet:
Guten Abend BartTheDevil89.

Mein Problem sind die ??? - wie komme ich an die URL, die versucht wurde aufzurufen? Denn "REQUEST_URI" hilft mir ja leider nicht

Mir fallen da zwei Möglichkeiten ein.

1. Meines Wissens entspricht .htaccess' "ErrorDocument 404" einer serverinternen Verlinkung, was bedeuten würde, dass $_SERVER['REQUEST_URI'] die verwendete ("falsche") Adresse enthält (sofern Du error.php nicht direkt über die Browserzeile aufrufst!).

2. (Funktioniert nicht!) Sollte ich mich bei 1. irren, kannst/könntest Du die aufgerufene Adresse im Querystring mitgeben:
.htaccess:
Code:
ErrorDocument 404 /error.php?error=404[B]&wrongpage=%{REQUEST_URI}[/B]
error.php:
PHP:
echo "Sie haben versucht folgende URL aufzurufen: ".
htmlspecialchars($_GET['wrongpage'], ENT_QUOTES);

Ich hoffe, zumindest eine der beiden Methoden funktioniert bei Dir.

Gute Nacht
Valares
 
Zuletzt bearbeitet:
Guten Morgen,

Danke für die Hilfe.

1. Meines Wissens entspricht .htaccess' "ErrorDocument 404" einer serverinternen Verlinkung, was bedeuten würde, dass $_SERVER['REQUEST_URI'] die verwendete ("falsche") Adresse enthält (sofern Du error.php nicht direkt über die Browserzeile aufrufst!).

Nein, errordocument gibt dann leider die error.php als REQUEST_URI zurück.

2. Sollte ich mich bei 1. irren, kannst/könntest Du die aufgerufene Adresse im Querystring mitgeben:
.htaccess:
Code:
ErrorDocument 404 error.php?error=404[B]&wrongpage=%{REQUEST_URI}[/B]
error.php:
PHP:
echo "Sie haben versucht folgende URL aufzurufen: ".
htmlspecialchars($_GET['wrongpage'], ENT_QUOTES);

Das "%{REQUEST_URI}" scheint er bei errordocument nicht zu nehmen. Er nimmt das 1:1 in die URL und habe dann das %{REQUEST_URI} in der URL so stehen.

Laut Apache Doku dürften die Interessanten Werte in den REDIRECT_*-Headern stehen:

:arrow: https://httpd.apache.org/docs/2.4/custom-error.html#variables

Ansonsten einfach mal $_SERVER vardumpen und gucken, was da so drin steht.

Klingt interessant - Problem ist noch, dass ich aber auf eine http-URL weiterleite, da ich sonst Probleme mit Unterordnern habe. In dem Fall werden diese Variablen leider alle nicht genutzt.
 
Ich hatte endlich die Gelegenheit, meine beiden Vorschläge mittels XAMPP zu testen.

[...]Das "%{REQUEST_URI}" scheint er bei errordocument nicht zu nehmen. Er nimmt das 1:1 in die URL und habe dann das %{REQUEST_URI} in der URL so stehen.[...]

Leider wahr, dieser Vorschlag taugt nix :-? .

[...]1. Meines Wissens entspricht .htaccess' "ErrorDocument 404" einer serverinternen Verlinkung, was bedeuten würde, dass $_SERVER['REQUEST_URI'] die verwendete ("falsche") Adresse enthält[...]
Nein, errordocument gibt dann leider die error.php als REQUEST_URI zurück.

Das wiederum ist seltsam. In meinem Versuchsaufbau enthält die $_SERVER['REQUEST_URI'] die aufgerufene Seite. Versuchsaufbau:
.htaccess:
Code:
ErrorDocument 404 /error.php
error.php:
PHP:
<?php
echo "Hallo!<br>"; //Ich wiederhole diese Zeile 50 Mal, um den IE-Bug zu umgehen (zu kleine Seiten werden nicht immer übermittelt/angezeigt).
echo $_SERVER['REQUEST_URI']."<br>";
?>
Adressaufruf schrieb:
https://localhost/blablabla
Ausgabe schrieb:
Hallo![...x50]
/blablabla
Das könnte an der Apache-Version liegen, oder...

[...]Problem ist noch, dass ich aber auf eine http-URL weiterleite, da ich sonst Probleme mit Unterordnern habe.[...]

Das hier ist eine wichtige, bisher fehlende Information! Wenn Du auf eine externe Seite verweist, dann ist es etwas anderes, als wenn Du auf eine interne Seite verweist! Ausser ich habe das falsch verstanden. Welcher dieser beiden Varianten verwendest Du?:
Code:
ErrorDocument 404 /error.php
#ODER
ErrorDocument 404 https://www.example.com/error.php
Denn diese Seite hier besagt:
https://jendryschik.de schrieb:
[...]Die Direktive ErrorDocument
[...]Wenn Sie auf eine externe Ressource verweisen, sollten Sie beachten, dass der Apache Webserver eine Weiterleitung zum Client sendet, um diesem mitzuteilen, wo das Dokument zu finden ist, auch wenn das Dokument letztlich wieder zum gleichen Server führt. Das führt unter anderem dazu, dass der Client zumindest vom Apache 1.3 nicht den Original-Statuscode erhält, sondern stattdessen einen Weiterleitungs-Statuscode.[...]
Also, könnte es sein, dass das das Problem ist?
 
Danke - war wohl die externe URL.

Code:
ErrorDocument 404 https://www.domain.de/error.php

Habe jetzt umgebaut, sodass es mit internen Links auch läuft - etwas aufwändiger, weil komplexeres System, aber dann kann ich über die R_U arbeiten, wie vorgeschlagen.

Danke, läuft jetzt