GraffitiX Index du Forum

 
 Sujets suivisSujets suivis   FAQFAQ   RechercherRechercher   Liste des MembresListe des Membres   Groupes d'utilisateursGroupes d'utilisateurs   S'enregistrerS'enregistrer 
 ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 

PHP : l'URL demandée lors d'une 404...

 
Poster un nouveau sujet   Répondre au sujet    GraffitiX Index du Forum -> Créer et gérer son site
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
jjardoino
Site Admin


Inscrit le: 14 Fév 2005
Messages: 3198
Localisation: Paris

MessagePosté le: Lun 04 Sep 2006 21:46    Sujet du message: PHP : l'URL demandée lors d'une 404... Répondre en citant

..pour affiner la page d'erreur 404 personnalisée, quand les techniques habituelles ne fonctionnent pas avec un hébergeur particulier... Le but était, quand on utilise un signet obsolète (parce qu'il est composé d'un chemin traditionnel plutôt qu'en "?pg=" et que le fichier a été déplacé depuis, par exemple), de pouvoir donner, sur la page 404, le bon lien vers la page demandée.

Je n'avais eu aucune difficulté pour l'implémenter sur Free quand j'ai changé d'hébergeur (donc redirection Free -> Online exacte) et ça fonctionne d'ailleurs toujurs très bien. Comme cela ne fonctionnait pas sur Online, j'ai eu largement l'occasion de ré-étudier le script sur Free et de le tester.

Donc je vais raconter, car cela peut donner des pistes à ceux qui, même respectant la logique, n'arrivent plus à s'en sortir.

Il suffisait de récupérer une variable d'environnement REQUEST_URI, qui renvoie l'adresse qui a été demandée sans le domaine et sous forme "/dossier1/dossier2/nomfichier" (bien entendu, les variables ajoutées à l'URL via "?" et "&" sont également récupérées). Après, il est simple d'isoler le nom de fichier proprement dit et, sur Graffitix, je le met en comparaison avec les variables de pages que j'utilise afin de recomposer l'URL exacte.

Incroyable, les quelques lignes de code nécessaire ne fonctionnent pas sur Online. C'est pourtant un peu comme chez Free...

Online fait partie des serveurs qui renvoient dans "REQUEST_URI", en cas d'erreur 404, le nom de la page 404 elle-même, ce qui n'a évidemment aucun intérêt...

Quand on se retrouve dans cette situation, j'ai lu qu'on pouvait trouver une parade en modifiant le fichier .htaccess afin qu'il pointe sur l'adresse absolue de la page 404 plutôt que l'adresse relative (c'est-à-dire en désignant le chemin complet avec le nom de domaine). Pas de chance, sur Online cela ne fonctionne pas mieux...

Ne vous méprenez pas, en temps normal c'est bien la variable "REQUEST_URI" qu'il faut utiliser et non HTTP_REFERER. En effet, "HTTP_REFERER" contient la page d'où on vient, et on se dit que c'est bien ça, c'est la page qui a amené à l'erreur 404. Mais il s'agit de la page d'où on vient si elle existe. Dans le cas d'une URL fausse, la page telle qu'elle est adressée n'existe pas. Et c'est pourquoi il faut récupérer le contenu de ce qui a été demandé.

Bien entendu, j'ai utilisé les deux façons d'obtenir cette donnée : getenv("REQUEST_URI") et $_SERVER["REQUEST_URI"], mais sans plus de succès...

Je m'en suis sorti avec une autre utlisation de la fonction phpinfo(). En général, on met cette fonction toute seule dans un script, afin d'obtenir un tableau complet de la configuration PHP du serveur utilisé. Et on peut y trouver, entre autres, le contenu des variables d'environnement. Et, comme on l'appelle en général grâce à un fichier existant, depuis un lien valide sur une page elle-même valide, cela ne nous donne pas suffisamment d'informations sur la variable à utiliser.

"REQUEST_URI" ne semble pas être bon, mais c'est uniquement parce que, dans ce cas, la page demandée a été obtenue. Donc le contenu de "REQUEST_URI" est identique à celui de "SCRIPT_NAME". Et, dans cette utilisation traditionnelle de phpinfo(), "HTTP_REFERER" est très tentant car il contient justement le chemin de la page précédente... Mais c'est parce que, toujours dans ce cas, la page précédente existe bien.

En utilisant autrement phpinfo(), les informations obtenues peuvent être bien plus intéressantes ! En l'occurrence, j'ai simplement placé l'instruction dans le code PHP de la page 404. Ainsi j'ai pu obtenir le contenu des variables d'environnement quand on arrive sur cette page 404, donc en situation réelle.

L'utilisation est très simple : on entre une adresse erronée qui va assurément mener à la 404, et la page 404 affiche alors tout le tableau de la configuration et des variables PHP, puis le contenu qu'on a donné à la page. Idéal pour le test.

En tout cas, c'est ainsi que j'ai pu découvrir que, sur Online, la variable REDIRECT_URL me donnait l'adresse qui avait été effectivement demandée. Quel soulagement, après y avoir passé quand même un bon bout de temps et accumulé autant de frustration.

Frustration car, sur Free, ça marche tout seul avec "REQUEST_URI" et, surtout, cela me permet de rediriger vers les bonnes adresses sur Online les requêtes, même fausses, effectuées sur Free... Imaginez la déprime quand quelque chose est capable de fonctionner d'un hébergeur à un autre (tous deux étant très proches) mais pas en interne sur l'hébergeur payant...

Bon, certains d'entre vous ont sûrement eu l'idée d'utiliser phpinfo() en l'intégrant au code de leurs pages plutôt que ne l'utiliser que sur une page à part. Moi je n'en avais jamais eu besoin, donc je n'en avais jamais eu l'idée, et je suppose que je ne dois pas être le seul.

Et j'espère, avec cette mésaventure déroutante (et, là, après avoir un peu fouillé sur le Web pour trouver des réponses, j'ai surtout vu un maximum de questions du même type, donc je sais que je ne suis pas un cas isolé) j'éspère donc que cela pourra servir à quelqu'un se retrouvant dans la même impasse.

D'autres vont sans doute se dire que tout ça c'est du charabia, mais ceux qui souhaitent gérer des choses intéressantes sur leur site comprendront l'utilité de toute cette histoire.

L'idée, pour moi, était de pouvoir fournir au visiteur la bonne adresse pour la page qu'il demandait si, à cause d'un vieux signet, il aboutissait à la page 404. Ma page 404, si au moins le nom du fichier est correct, peut reconstruire la bonne URL d'un fichier qui a été déplacé.

Évidemment, pour ceux qui utilisent des signets avec des URL de type "index.php?pg=...", ça n'a pas d'incidence car ils appellent une variable dont le chemin sera retrouvé dynamiquement. Mais beaucoup utilisent des URL "traduites" en chemin et nom de fichier, parce que c'est ainsi que Google les renvoie. Ce n'est pas le plus pratique, mais je ne peux pas m'en désintéresser. Ces utilisateurs qui ont ce type d'adresse ne l'ont pas choisi, et je voulais trouver une solution afin qu'ils puissent retrouver la page immédiatement si possible, sans passer par la page d'accueil et chercher partout ensuite.

En plus, ce n'est pas difficile à réaliser. Le plus difficile est de récupérer l'adresse demandée. Ensuite, si on a une connaissance correcte de PHP, isoler le nom de fichier et le comparer avec les éléments d'une variable array qui contient tous les noms de fichiers et un moyen de retrouver leur chemin n'est qu'une question de patience. Enfin, pouvoir isoler les variables ajoutées dans l'URL n'est pas difficile non plus.

Tout ceci, dans l'ordre, permet :

- la bonne variable d'environnement ("REQUEST_URI" ou "REDIRECT_URL" suivant le serveur) récupère l'adresse demandée, sous le format "/dossier1/dossier2/fichier?var1=valeur1&var2=valeur2" (par exemple)

- une bonne utilisation de la fonction explode() va permettre d'isoler le nom de fichier et la partie après le "?".

- en comparant le nom de fichier seul avec une variable array qui contient tous les noms de fichiers et leurs correspondances, on trouvera la correspondance. Cela signifie évidemment que vous vous êtes arrangé pour que les noms de fichiers soient uniques, mais ce n'est pas bien gênant.

- une fois retrouvé le bon chemin, vous recomposez l'URL aisément : chemin + fichier + variables.

Je n'ai pas donné ici le détail du code, je voulais juste parler de certains obstacles qui apparaissent comme obstinés. Si vous ne pouvez pas écrire le code, c'est que vous n'êtes pas suffisamment familiarisé avec le PHP. Si, au contraire, vous voyez comment l'écrire (ou bien si vous vous sentez d'attaque à apprendre pour affronter cette petite difficulté), peut-être que les pistes que j'ai donné ici vous éviteront des heures à vous arracher les cheveux...
_________________
Jean-Jacques Ardoino
Si vous voulez aider GraffitiX...
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Adresse AIM
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    GraffitiX Index du Forum -> Créer et gérer son site Toutes les heures sont au format GMT + 1 Heure
Page 1 sur 1

 
Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com