TROUVER LA PAGE D'ORIGINE D'UNE ERREUR 404

WRInaute discret
Je suppose que je suis en train de réinventer l'eau chaude. Alors demander si klkun a déjà la solution, qui existe forcément...
Voilà mon problème : à force de bidouiller le site dans tous les sens, de trouver toujours LA solution.... bref, j'en arrive à avoir une page d'erreur qui reçoit autant de visiteurs que toutes les autres pages... C'est un peu con! J'ai tenté de me faire envoyer un mail à chaque erreur 404 en m'envoyant le nom de la pga d'origine, celle qui contient un lien qui renvoit une erreur 404. Que nenni! Pipo! pas de referrer dans le mail.
Comment récupérer le nom de la page d'origine ou quelle est la meilleure solution pour recevoir ce mail et surtout LE NOM DE LA PAGE QUI M.....
Certains hébergeurs proposent cette fonction... Pas le mien!
C'est grave, docteur?
 
Olivier Duffez (admin)
Membre du personnel
dis-nous ce que tu as mis dans ton .htaccess pour gérer la page 404, ainsi que les lignes de code utilisées pour t'envoyer le referer par email...
 
WRInaute impliqué
Plutôt que de t'envoyer un mail à chaque erreur (ce que je trouve assez démesuré...), tu peux stocker les info dans un fichier.
En PHP, tu auras l'url demandée dans la variable $_SERVER["REQUEST_URI"].

Tu peux même te mettre toutes les autres infos (time, referer, user-agent, etc...), des logs d'erreur en quelque sorte...
L'essayer c'est l'adopter ;)
 
WRInaute discret
Remi L. a dit:
Plutôt que de t'envoyer un mail à chaque erreur (ce que je trouve assez démesuré...), tu peux stocker les info dans un fichier.
En PHP, tu auras l'url demandée dans la variable $_SERVER["REQUEST_URI"].

Tu peux même te mettre toutes les autres infos (time, referer, user-agent, etc...), des logs d'erreur en quelque sorte...
L'essayer c'est l'adopter ;)

Le pblme c'est que si je fais une redirection vers une page "erreur.php", l'URI devient tout logiquement www.tartempion/erreur.php....

Y a-t-il un moyen de récupérer ce REQUEST_URI sous une forme quelconque dans le HTACCESS qui permettrait par exemple de faire une redirection genre :

erreur.php?page=resultat_fontion_htaccess?
 
WRInaute discret
J'ai cherché un peu partout une doc sur l'utilisaion des variables dans le HTACCESS... Rien! A part l'incourtournable article de Dan Hezl qu'on retrouve sur 2165487 sites (au moins...) rien d'autre!
Pourtant elles existent et je ne dois pas être loin de la solution...
dernier esai infructueux en date :
dans le HTACCESS :

ErrorDocument 404 http://w*w.malango.net/erreur.php?page= %{HTTP_REFERER}

ça marche pas mais c'est dans l'écriture de la variable HTTP_REFERER que ça m...

Est-il possible de trouver une doc sur les variables utilisées dans le HTACCESS et la manière de les utiliser????
 
WRInaute occasionnel
Oui, oui, pas de problème : la doc Apache, la liste des directives, celles valides pour un .htaccess ont un h dans la colonne de droite.

Code:
ErrorDocument 404 /erreur.php
et dans erreur.php tu récupères les variables du serveur et de la requête, voir les variables prédéfinies de PHP

Dans la directive ErrorDocument, utiliser un nom de domaine complet force une redirection. La syntaxe ci-dessus fait appel à un fichier local et préserve le code de retour (404).
 
WRInaute discret
nikoshr a dit:
Oui, oui, pas de problème : la doc Apache, la liste des directives, celles valides pour un .htaccess ont un h dans la colonne de droite.

Code:
ErrorDocument 404 /erreur.php
et dans erreur.php tu récupères les variables du serveur et de la requête, voir les variables prédéfinies de PHP

Dans la directive ErrorDocument, utiliser un nom de domaine complet force une redirection. La syntaxe ci-dessus fait appel à un fichier local et préserve le code de retour (404).

COOL, on avance! En fait, c'est bien le chemin absolu qui foutait la m...
Par contre, quand l'erreur vient d'une page du site, le $_SERVER['HTTP_REFERRER'] ne renvoit aucune valeur... J'attends de voir ce qui se passe quand le lien vient de l'extérieur, mais à priori ça marche : j'utilise ça pour mon compteur...
 
WRInaute impliqué
:? C'est pas le referer qu'il te faut... c'est request_uri...
Tiens, voilà en gros le code que j'utilise depuis un certain temps pour me créer des logs au même format que ceux d'Apache avec les erreurs 404.
Ce bout de PHP est placé dans mon erreur404.php mis en place grâce au htaccess, tel que l'a décrit Nikoshr
Code:
<?php
$logfile = "../erreurs404.log";
$mydomain = "www.mondomaine.com";
$timezone="+0100";
$MonthLib = array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
$lt= localtime(time());
$time= sprintf("[%02d/%s/%04d:%02d:%02d:%02d $timezone]",$lt[3],$MonthLib[$lt[4]],$lt[5]+1900,$lt[2],$lt[1],$lt[0]);
$refer=$_SERVER["HTTP_REFERER"];
$fd=fopen($logfile,"a");
if($fd){
  flock($fd,LOCK_EX);
	fputs($fd,$_SERVER["REMOTE_ADDR"]." $mydomain - $time \"GET ".$_SERVER["REQUEST_URI"]." ".$_SERVER["SERVER_PROTOCOL"]."\" 404 -"." \"$refer\" \"".$_SERVER["HTTP_USER_AGENT"]."\"\n");
	flock($fd,LOCK_UN);
	fclose($fd);
}
?>
Le fichier de log est placé au dessus de ma zone accessible par http, pour que je sois le seul à pouvoir le lire.
Je récupère ce fichier assez régulièrement et cela me suffit à cerner les problèmes, tout en m'évitant d'extirper les erreurs 404 de mes fichiers ordinaires de logs.
Voili voilou...
 
WRInaute discret
Remi L. a dit:
:? C'est pas le referer qu'il te faut... c'est request_uri...
Tiens, voilà en gros le code que j'utilise depuis un certain temps pour me créer des logs au même format que ceux d'Apache avec les erreurs 404.
Ce bout de PHP est placé dans mon erreur404.php mis en place grâce au htaccess, tel que l'a décrit Nikoshr
Code:
<?php
$logfile = "../erreurs404.log";
$mydomain = "www.mondomaine.com";
$timezone="+0100";
$MonthLib = array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
$lt= localtime(time());
$time= sprintf("[%02d/%s/%04d:%02d:%02d:%02d $timezone]",$lt[3],$MonthLib[$lt[4]],$lt[5]+1900,$lt[2],$lt[1],$lt[0]);
$refer=$_SERVER["HTTP_REFERER"];
$fd=fopen($logfile,"a");
if($fd){
  flock($fd,LOCK_EX);
	fputs($fd,$_SERVER["REMOTE_ADDR"]." $mydomain - $time "GET ".$_SERVER["REQUEST_URI"]." ".$_SERVER["SERVER_PROTOCOL"]."" 404 -"." "$refer" "".$_SERVER["HTTP_USER_AGENT"].""\n");
	flock($fd,LOCK_UN);
	fclose($fd);
}
?>
Le fichier de log est placé au dessus de ma zone accessible par http, pour que je sois le seul à pouvoir le lire.
Je récupère ce fichier assez régulièrement et cela me suffit à cerner les problèmes, tout en m'évitant d'extirper les erreurs 404 de mes fichiers ordinaires de logs.
Voili voilou...

L'URI, je la récupère bien, mais ce que je veux savoir c'est sur quelle page il y a le lien mort... que ce soit en interne ou en externe (histoire de prévenir le site ou de mettre une redirection...)
J'essaie ta moulinette et je te dis quoi
Merci
 
Nouveau WRInaute
heu... j'ai peut-être mal compris un truc mais j'ai eu l'impression qu'il te disait de ne plus regarder le REFERER mais plutôt le REQUEST_URI
(qu'il récupère également au passage)

normalement si le htaccess fait une réécriture locale (sans le http:// ... )
et que tu prends le REQUEST_URI tu as ce que tu cherchais.

c'est une solution de ce type qu'il te faudra utiliser, tu peux donc tenter pourquoi pas d'autres variables, mais l'une de ces deux là est sensée convenir

THE_REQUEST
The full HTTP request line sent by the browser to the server (e.g., "GET / index.html HTTP/1.1"). This does not include any additional headers sent by the browser.

REQUEST_URI
The resource requested in the HTTP request line. (In the example above, this would be "/index.html".)

mais ceci dit la doc d'Apache cite aussi des usages comme ceux auxquels tu penses:
RewriteRule ^(.+) %{HTTP_HOST}$1
par exemple...

donc en utilisant les variables qui nous intéressent ici, il doit y avoir moyen de faire une ré-écriture (sans redirection) pour avoir du
.....php?uri=%{REQUEST_URI}

si ni l'un ni l'autre ne fonctionne ça sera à en perdre son latin.
 
Nouveau WRInaute
Trouvé sur un autre forum, ça pourrait t'aider:

the $_SERVER['HTTP_REFERER'] is empty in a custom error page. But I did some research and discovered that this info is available via getenv('HTTP_REFERER').

Maybe this may help other people with the same problem.

note que pour certains ça fonctionne très bien de la première façon, et pour lui seulement de cette façon là, peut-être des histoires de configuration de php ou du derveur ?


essaye toujours... on ne sait jamais. Si ça se trouve tu peux l'avoir quand même ton referer... Et puis sinon (puisque le referer n'est pas une info fiable: parfois masquée par la config parfois non émis par le navigateur) tu pourras toujours essayer également:
$_SERVER['remote_host'] pour voir éventuellement si ça vient toujorus du même endroit (si oui, l'erreur ne vient peut-être pas de toi mais d'un favori mal mémorisé ?)

enfin bon... voilà les idées que j'ai ... A+
 
WRInaute discret
ÇA MARCHE !!!

On récapitule?

dans le htaccess :
ErrorDocument 404 /erreur.php
avec une adresse RELATIVE (merci nikoshr!)

dans la page d'erreur :

$prov = getenv('HTTP_REFERER');
$uri = $_SERVER["REQUEST_URI"];
avec utilisation de la fonction getenv() (merci Davidc!)
 
Nouveau WRInaute
Moi je viens de me prendre la tête avec ça sur un site chez free.

Ma solution :

.htaccess :
Code:
ErrorDocument 404 /404.php

/404.php :
Code:
<?php

//echo 'REFERER = '.getenv('HTTP_REFERER');
//echo '<br />REQUEST_URI = '.getenv("REQUEST_URI");

//Enlève le / du début
$title = ereg_replace("^/", "", getenv("REQUEST_URI"));
//die($title);

header('HTTP/1.0 200 OK');
header("Location: index.php?title='.$title);

?>
 
Discussions similaires
Haut