Redirection 404 via le .htaccess / pb avec les liens relatifs

Nouveau WRInaute
bonjour à tous

je viens de mettre la ligne
ErrorDocument 404 /erreur_404.php
dans mon .htaccess

j'ai créé la page erreur_404.php sur mon site
cette page utilise des liens relatifs (dont certains d'entre eux ne peuvent pas être traduits en liens absolus)

lorsque l'on tombe sur des pages en 404, le transfert se fait bien vers la page erreur_404.php

j'ai cependant un problème lorsque la page en erreur 404 n'est pas située au niveau / du site, alors que ma page erreur_404.php l'est

dans ce cas, erreur_404.php tente de trouver les éléments (images par exemple) dont elle a besoin à partir de / mais elle le fait en fait à partir de l'adresse de la page qui a déclenchée l'erreur 404 initialement

exemple :

https://site.com/dossier/sous-dossier/page-en-erreur-404.php me retourne une erreur 404

elle déclenche erreur_404.php et cette dernière cherche son image sur /image-de-erreur_404.jpg mais elle ne la trouve pas, car en fait elle tente de la trouver sur https://site.com/dossier/sous-dossier/image-de-erreur_404.jpg

erreur_404.php cherche sur /dossier/sous-dossier/ au lieu de chercher sur /

j'ai compris que je ne peux pas utiliser :
ErrorDocument 404 https://site.com/erreur_404.php (qui pourtant fonctionne bien…)
car j'obtiens alors un code 302 que je ne veux pas (pour les robots)

voilà, il y a quelque chose qui m'échappe…

merci d'avance pour votre aide

laurent
 
WRInaute accro
C'est tout le problème des liens relatifs, qui sont toujours relatifs à la page qui les affiche. Ta "page" erreur 404 fonctionne en remplacement de la page en erreur, mais ce n'est pas une redirection.
 
Nouveau WRInaute
je pensais qu'il serait logique qu'en indiquant /erreur_404.php cela remettrait en quelque sorte les compteurs à zéro ; je ne comprends pas trop pourquoi "/dossier/sous-dossier/" reste en mémoire… ???

je me demande si en cherchant du côté des RewriteRule et notamment du RewriteBase / cela pourrait solutionner mon problème ? Le terme RewriteBase semble porteur… ??
 
Olivier Duffez (admin)
Membre du personnel
il faudrait utiliser des URL absolues
ou voir du côté de la balise <base> (je ne sais pas si c'est adapté ici)
 
Nouveau WRInaute
bien joué olivier !

je ne pouvais pas utiliser des url absolues alors j'ai tenté ma chance en introduisant la balise <base> dans la partie head de ma page et oui cela fonctionne !!!

quel plaisir de trouver des solutions à ses problèmes et +1 pour webrankinfo !
 
Nouveau WRInaute
une petite question légèrement en rapport :

est-il vrai, au niveau du .htaccess, qu'un "ErrorDocument" est exécuté avant un "Redirect" ? (serveur apache)
 
Nouveau WRInaute
erreur !

j'étais tombé dans un cas de figure où cela marchait, mais non, la balise <base> hélas ne solutionne pas le problème…
 
WRInaute impliqué
j'avais mis ça dans le head de ma page
HTML:
<base href="https://monsite.com">
Bizarre que ça n'ait pas fonctionné, alors.

Je ne vois pas trop de raison pour que tu ne puisses pas avoir des liens absolus dans ta 404, mais si c'est le cas, tu peux toujours :

Soit réécrire les URL avant d'envoyer la page :
ob_start() pour éviter l'envoi du HTML
ob_get_contents() pour récupérer le HTML
utiliser les fonctions de DOM de PHP pour trouver les href et src qui ne commencent pas par / et l'ajouter.
Transformer le DOM en HTML
Envoyer le contenu.
Mais bon, c'est vraiment moche, et il peut y avoir encore d'autres cas à gérer (srcset, background-image:url dans des CSS inline...)

Soit, si c'est vraiment que dans le contenu de la page que tu n'arrives pas à gérer mais que pour ce qui est dans le head, ça va... mettre le contenu dans un iframe qui elle, sera à la racine. Peut-être.
Auquel cas je te conseille de l'insérer en JS et uniquement si tu n'es pas déjà dans une iframe.
Sinon, si un jour l'url de cette iFrame disparait... ce sera une 404, qui elle-même insèrera l'iframe... etc => récursion à l'infini.

C'est vraiment si tu es complètement bloqué... parce que franchement, ce sont deux mauvaises solutions.
 
WRInaute passionné
Le base devrait marcher, mais comme on a même pas l'url de son site pour vérifier, laissons tomber...
 
Nouveau WRInaute
J'ai finalement simplifié mes pages de gestion des erreurs 404 et 410 ce qui m'a permis de basculer en liens absolus à l'intérieur de ces pages, et du coup mes problèmes ont disparus.

Merci à tous ceux qui ont participé à cette discussion.
 
Discussions similaires
Haut