Redirection impossible depuis une page perso 404 ?

Nouveau WRInaute
Bonjour à tous

J'ai redirigé mes pages 404 vers mon fichier php se nommant /404.php.
Ceci à l'aide d'un .htaccess classique.
tout est OK jusqu'ici, ma page 404.php est bien prise en compte.

Par contre, au sein de cette page 404.php, je souhaite faire une redirection automatique vers une autre page (selon certains param...)

OR il s'avère que la redirection au niveau serveur, via script php avec Header ne fonctionne pas ! j'ai du me rabattre sur une redirection html avec 'meta'.

Je vous donne mon code entier, de mon script de mon fichier 404.php.
Pourriez vous m'affirmer ou m'infirmer si mon code est correct, et si c'est le cas, qu'il est effectivement impossible de faire une redirection php avec header( ... ) ???

Merci d'avance Very Happy


La redirection HTML fonctionne correctement (testé et retesté).

Pour tester la redirection via PHP, je retire tout le code entre Début/Fin HTML, et j'enlève le commentaire sur Header( ... ).

Résultat avec le Header(...) en php:
IE -> 404 de windows
FireFox -> page blanche.

fichier /404.php

Code:
<?php

// Inits
$dns = $_SERVER['HTTP_HOST'];
$chemin_et_param = $_SERVER['REQUEST_URI'];
$chemin_temp = explode( '?', $chemin_et_param );
$chemin = $chemin_temp[ 0 ];

// Choix décalage
if ( $dns == 'www.xxx.fr' ) $decalage = '/xx';
if ( $dns == 'www.yyy.com' ) $decalage = '/yy';
if ( $decalage == '' ) exit();

// Redirection ou page d'accueil
if ( is_readable( '.' . $decalage . $chemin ) )
  $redir = $dns . $decalage . $chemin_et_param;
else
  $redir = $dns;

// header( 'Location: http://' . $redir ); // MARCHE PAS !

// DEBUT HTML
echo( '<html><head>' );
// redirection html
echo( '<meta http-equiv="refresh" content="0;url= ' );
echo( 'http://' . $redir );
echo( '">' );
// page d'attente
echo( '</head><body>' );
echo( 'Un instant s.v.p.<br>' );
echo( 'Please wait a moment<br><br><br>' );
echo( 'redirection vers:   ' . $redir . '<br><br>');
//echo( 'URL demandée: ' . $chemin_et_param . '<br><br>' );
//echo( 'chemin testé: ' . $decalage . $chemin . '<br><br>' );
// remplissage pour pb IE 512 octets
echo( '
<small style="color: rgb(255, 255, 255);"><small><small><small><small><small><small><small>
fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill<br>
fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill<br>
fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill<br>
fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill<br>
fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill<br>
fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill<br>
fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill<br>
fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill<br>
fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill<br>
fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill<br>
fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill<br>
fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill<br>
fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill<br>
fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill<br>
fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill fill<br>
</small></small></small></small></small></small></small></small>
');
echo( '</body></html>' );
// FIN HTML

?>

PS modo: Je suis désolé, j'ai posté aussi dans le forum php... mais je crois que la place de mon post est mieux ici finalement.
 
Nouveau WRInaute
:), Je dois dire que j'ai un peu galéré pour trouver le pb. A vrai dire, m'en suis rendu compte tout seul après m'être bien pris la tête, et j'ai trouvé ce lien après.
En gros, dans une page 404 personnalisée, dans IE/Options Avancées/ il y a une option nommée 'Afficher les erreurs HTTP simplifiées par défaut' qui est cochée par défaut.
Le résultat ? toute page 404 qui fait moins de 512 octets, est ignorée et à la place est affichée la fameuse page 404 de Windows... :(
Sur FireFox il n'y a pas le problème.

D'ou le remplissage artificielle, pour que la page soit traitée par IE et que la redirection méta se fasse ! (en attendant que je puisse trouver une solution pour faire la redirection en php si c'est possible ?? 8O )

Après une courte recherche sur le net
http://www.apachefrance.com/Articles/7/page3.html

Note pour les utilisateurs d'Internet Explorer

Internet Explorer 5 et supérieur incluent des pages d'erreur standards présentées à l'internaute si le site Web ne propose pas de pages personnalisées OU si la taille de ces pages est inférieure à une certaine taille en octets (256 ou 512 selon le cas).

Pour contourner ce "problème", vous pouvez soit compléter la page d'erreur avec des commentaires HTML afin d'atteindre 512 octets, soit opter pour l'une des deux modifications suivantes dans Internet Explorer :
• Dans les options d'Internet Explorer, onglet "Avancés", décocher la case "Afficher des messages d'erreur HTTP simplifiés",
• Dans la base de registre, rechercher le dossier HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\ErrorThresholds. Vous trouverez alors plusieurs entrées correspondant à un code HTTP et la taille de page minimum attendue pour afficher la page du site plutôt que la page interne d'IE.
 
WRInaute accro
TicTacToe a dit:
Par contre, au sein de cette page 404.php, je souhaite faire une redirection automatique vers une autre page (selon certains param...)

OR il s'avère que la redirection au niveau serveur, via script php avec Header ne fonctionne pas ! j'ai du me rabattre sur une redirection html avec 'meta'.
Bonjour,

Il y a une contradiction dans ta demande. D'une part, tu utilises la technique de la page 404 personnalisée qui est faite pour renvoyer un code "erreur 404" au visiteur et, d'autre part, tu essaies de renvoyer un code de redirection (301 ou 302 ?). Clairement, ta page ne peut renvoyer qu'un seul code.

Jean-Luc
 
Nouveau WRInaute
??? je comprends pas ...

Je comprends pas ton interrogation.
En fait je viens de fusionner 2 sites qui avaient chacun leur espace et leur DNS. Ils se retrouvent sur 1 seul espace avec les 2 DNS pointants sur ce même espace dorénavant.

Ces 2 sites je les ai mis chacun dans un dossier différent, c'est quand même plus propre.

Donc, pour que ce soit tranparent pour le user, s'il à bookmarké un lien d'un des 2 sites, il ne sera plus valide... SAUF si je gère le décalage de dossier.

URL Invalide (sans le décalage de dossier) -> page 404 perso -> traitement de l'URI -> redirection dans le bon dossier OU page d'accueil si l'URI ne peut vraiment pas être retrouvée. Et ceci, en fonction du DNS tapé pour accéder à l'un des 2 sites.

le code que j'ai posté, en laissant le commentaires sur le code PHP header(...) fait exactement ce que je veux. Cela fonctionne.

Mais ca me parait moyennement satisfaisant car cela peut faire apparaitre la page de redirection pdt qq sec (vu que c'est traité coté client)... en php ce serait mieux, mais ca marche pas :(

PS: la redirection sur l'index principal de l'espace traite déjà ma redirection sur l'un des 2 sites en fonction du DNS tapé par le user, et là ca fonctionne très bien avec le header(...) en PHP
 
WRInaute accro
TicTacToe a dit:
Ces 2 sites je les ai mis chacun dans un dossier différent, c'est quand même plus propre.

Donc, pour que ce soit tranparent pour le user, s'il à bookmarké un lien d'un des 2 sites, il ne sera plus valide... SAUF si je gère le décalage de dossier.
D'accord.

TicTacToe a dit:
URL Invalide (sans le décalage de dossier) -> page 404 perso -> traitement de l'URI -> redirection dans le bon dossier OU page d'accueil si l'URI ne peut vraiment pas être retrouvée. Et ceci, en fonction du DNS tapé pour accéder à l'un des 2 sites.
Je verrais ceci autrement : URL "ancien style" (sans le décalage de dossier) -> traitement par .htaccess qui reconnaît l'URL "ancien style" et qui redirige vers le bon dossier ou la page d'accueil par une redirection 301. Il faut donc agir avant la détection de l'erreur 404.

Quelles sont les différences ? Ici il n'est plus question d'erreur 404, car, en fait, tu ne veux pas indiquer une erreur, mais faire une redirection. Le choix de la redirection 301 est optimal pour le référencement.

TicTacToe a dit:
le code que j'ai posté, en laissant le commentaires sur le code PHP header(...) fait exactement ce que je veux. Cela fonctionne.

Mais ca me parait moyennement satisfaisant car cela peut faire apparaitre la page de redirection pdt qq sec (vu que c'est traité coté client)...
D'accord.

TicTacToe a dit:
en php ce serait mieux, mais ca marche pas
Je disais même que ça ne peut pas marcher puisqu'avec ta solution tu essaies d'envoyer pour une seule page, un code 404 et un code 301 ou 302. Pour que ça marche, il ne faut plus partir d'une situation d'erreur 404.

J'espère que ceci est plus clair. :wink:

Jean-Luc
 
Nouveau WRInaute
:D

Alors là merci beaucoup !
C'est la 1ere fois que qq'un comprend exactement ce problème :)

Je dois dire que je suis très novice dans ce type de problème. :oops:

Cela me rassure également de savoir que ce n'est pas possible en php.

Je ne saisie pas exactement comment sont gérés ces code 404, 302,301 etc...
qui les envoie, qui les récupère, qui les traite ... ? mais je vais me renseigner.

Actuellement, dans mon .htaccess, je n'ai que:
Code:
ErrorDocument 404 /404.php

SI je comprends bien, c'est au niveau de ce .htaccess, qu'il me faut gérer le décalage
Par contre si le lien n'existe pas, je voudrais revenir sur ma page d'accueil mais.... du site correct / dns

Ex: qqun tape www.xx.fr/undossier/unepage.htm

Dans un 1er temps, le .htaccess va rediriger automatiquement vers le lien:
www.xx.fr/xx/undossier/unepage.htm
si le lien existe, pas de problème, la page est chargée.

Si le lien n'existe pas, un 404 va être générée. Et là je retombe sur le même problème. Car je souhaite que la page principale soit affichée, mais la page principale du bon site !

- si je déclare mon /index.php actuelle comme page 404. Ce fichier index.php fait déjà une redirection vers www.xxx.fr/xx/ ou www.yyy.com/yy/ en fonction du DNS récupéré, donc ca ne marchera pas car je retomberai sur le même pb qu'actuellement :(

L'URL Rewriting permet visiblement de faire bcp de chose, mais j'y connais rien, je vais potasser sur le forum, il y a l'air d'avoir beaucoup d'infos :)

En résumé:

J'ai 2 sites logiques sur un meme espace physique
www.xx.fr/xx/
www.yy.com/yy/
étant donné que les 2 DNS pointent sur ce même espace physique.

lorsque un user tape www.xx.fr il doit se retrouver sur www.xx.fr/xx
lorsque un user tape www.xx.fr/bidule il doit se retrouver sur www.xx.fr/xx/bidule
lorsque un user tape www.xx.fr/url_invalide il doit se retrouver sur www.xx.fr/xx

Exactement même topo s'il remplace xx.fr par yy.com !

C'est possible par URLRewriting dans un .htaccess ?? avant que je me lance ?

Dans tous les cas merci de ta réponse précédente Jeanluc
 
WRInaute accro
TicTacToe a dit:
Dans un 1er temps, le .htaccess va rediriger automatiquement vers le lien:
www.xx.fr/xx/undossier/unepage.htm
si le lien existe, pas de problème, la page est chargée.
Ok.

TicTacToe a dit:
Si le lien n'existe pas, un 404 va être générée. Et là je retombe sur le même problème. Car je souhaite que la page principale soit affichée, mais la page principale du bon site !
A ce niveau, plutôt que de faire une redirection, tu pourrais faire un include PHP de la bonne page.

TicTacToe a dit:
L'URL Rewriting permet visiblement de faire bcp de chose, mais j'y connais rien, je vais potasser sur le forum, il y a l'air d'avoir beaucoup d'infos
Vois aussi ces deux bonnes adresses :
- Le fichier .htaccess
- mod_rewrite et la réécriture d’URL

TicTacToe a dit:
C'est possible par URLRewriting dans un .htaccess ?? avant que je me lance ?
Tu peux arriver à tes fins en combinant .htaccess et un peu de PHP, mais je n'ai pas le temps d'approfondir pour l'instant.

Jean-Luc
 
Nouveau WRInaute
A mon avis tu as une redirection apache donc forcément un header envoyé par apache. Php ne peut donc pas faire de nouvelle redirection puisque le header a déjà été envoyé.

+1 avec jeanluc l'include est la bonne solution je pense ;)
 
Discussions similaires
Haut