Redirection PHP en relatif et Headers HTTP

Nouveau WRInaute
Bonjour,

c'est mon premier message ici. :oops:

Je viens de déplacer des pages sur mon site; les anciennes étaient
statiques HTML et référencées, les nouvelles sont dynamiques PHP.

Je m'apprête à utiliser le conseil "redirection 301" plutôt que "redirection
par Refresh" qui était ma première tentative.

Cela m'occasionne deux questions:
- c'est normal que je doive envoyer les headers HTTP avant la redirection ?
(sinon, sur mon site de test local ça ne marche pas)
- est-ce qu'une redirection en relatif sur le site (URL partielle)
fonctionnera en termes de référencement ?

Voici le code en question: il redirige une page
/zdoc/fr_index.html vers /oklin2/zdoc/ok1_zdoc.php?lang=fr

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
</HEAD>
<BODY> </BODY>
</HTML>

<?php
header("Status : 301 Moved Permanently");
header("Location: /oklin2/zdoc/ok1_zdoc.php?lang=fr");
exit();
?>

Merci pour toute aide. :wink:
Vincent.
 
WRInaute passionné
Salut Vincent et bienvenue à bord ! :wink:

Les entêtes doivent être envoyées avant toute chose. Ce que tu constates est donc normal. Attention à ne pas avoir ne fût-ce qu'une balise BR qui traîne avant cela. :wink:

Le standard HTTP/1.1 exige une URI absolue comme argument à Location:
Certains clients interprètent une adresse relative, mais c'est prendre un risque inutile.
Surtout si tu veux renvoyer une entête 301 ...

Il faut donc que tu mettes:
Code:
<?php 
header("Status : 301 Moved Permanently"); 
header("Location: http://www.domane.tld/oklin2/zdoc/ok1_zdoc.php?lang=fr"); 
exit(); 
?>

Dan
 
WRInaute discret
Bonjour vwartelle, et bienvenue sur Webrankinfo !

Non, il n'est pas normal que tu envois le moindre caractère avant la redirection. Normalement ta page doit se réduire à :
<?php
header("Location: /oklin2/zdoc/ok1_zdoc.php?lang=fr");
?>

Ca fait quelques temps que je n'ai pas écris de php, donc il y a peut-être une erreur. Mais ce qui est important, c'est que ta page ne doit contenir QUE LA REDIRECTION. Tout le reste, est inutile.

Pour ta seconde question, bien sur, les redirections relatives fonctionnent très bien, même en terme de référencement.

a+
 
WRInaute discret
hetzeld a dit:
Le standard HTTP/1.1 exige une URI absolue comme agrument à Location:

Salut Dan !!

Dis moi en ASP je me contente d'un :

reponse.redirect("/mapage.asp")

La question est donc : "Est-ce que ASP et PHP ne complètent pas cet ordre pour le rendre absolu ?"

a++
 
Nouveau WRInaute
merci + oups

Merci pour vos réponses !

En fait j'avais fait n'importe quoi. :?
Ca donnait l'impression de marcher en raison de l'ancienne balise meta
Refresh, qui devait être restée en cache.

En réalité mon code ne marche pas du tout, il n'est pas interprété
parce que dans un fichier en extension .html (et non .php).

Donc :
je peux rediriger la page index.html (en anglais) en la remplaçant par
une page index.php qui fait la redirection, et cela seulement.

Par contre rediriger la page fr_index.html paraît plus délicat, en l'absence
de meilleure idée je laisserai la balise Refresh.
Sauf s'il y a moyen d'indiquer que la page fr_index.html doit être traitée
par le parser PHP : c'est possible, ça ?

Vincent.
 
WRInaute passionné
Salut Vincent,

Pourquoi n'utilises tu pas simplement une ou deux règles de réécriture dans ton .htaccess ?
Tu es sur un 90plan OVH et le mod_rewrite est activé.
Si tu as des doutes quant-à sa mise en place, donnes-nous tes anciennes pages (ou répertoires) ainsi que les nouvelles. On pourra sûrement t'aider.

Dan

PS: l'utilisation de header("location:...."); impose de laisser l'ancienne page sur ton serveur, pour contenir la redirection. Avec mod_rewrite, tu t'affranchis de cette obligation
 
Nouveau WRInaute
essais avec url rewrite

Voici le moment venu pour les quelques conseils.

Dan, j'ai lu ton article --> :p

Je fais des essais sur mon EasyPHP local, dans lequel j'ai activé mod_rewrite.

Dans le .htaccess de la racine, j'ai ajouté ceci
Options +FollowSymlinks
RewriteEngine on
RewriteRule ^nexistepas.html$ /oklin2/trouve.html [L]

Et ça marche; c'est à dire le browser affiche l'URL .../nexistepas.html
avec le contenu de /oklin2/trouve.html

Maintenant, si j'ajoute ceci :
RewriteRule ^fr_index.html$ /oklin2/zdoc/ok1_zdoc.php?lang=fr [L]

Cela marche toujours mais les liens vers les images (qui sont en relatif, de type
../pictures/) ne sont plus valides. Il m'est possible de les changer, mais
j'aimerais comprendre avant !

Et si j'écris :
RewriteRule ^/zdoc/fr_index.html$ /oklin2/zdoc/ok1_zdoc.php?lang=fr [L]
ou bien
RewriteRule ^\/zdoc\/fr_index.html$ /oklin2/zdoc/ok1_zdoc.php?lang=fr [L]

alors là ça ne marche pas. :(

Vincent.
 
WRInaute passionné
Bonjour,

Avec une règle comme:
Code:
RewriteRule ^fr_index.html$ /oklin2/zdoc/ok1_zdoc.php?lang=fr [L]

tu tombes dans le "piège" des répertoires virtuels (c'est dans l'article :wink: )
En quelques mots, lors de cette redirection, le navigateur cherche à résoudre les liens relatifs dans un répertoire qui n'existe pas...
Tu peux t'en sortir de 2 manières:
1 - tu mets des liens absolus pour toutes les images (et toutes les balises <a>...)
2 - tu utilises la balise < base href=... > (sans l'espace après le < :wink: )

Pour ton dernier exemple:
Code:
RewriteRule zdoc/fr_index.html$ /oklin2/zdoc/ok1_zdoc.php?lang=fr [L]
devrait marcher ! (sans le ^/)

Dan
 
Nouveau WRInaute
Merci pour le dépannage.

J'ai cru observer que la redirection ne fonctionnait pas si l'ancienne page
était toujours présente. C'est bien le cas ?

Au bout du compte je m'apprête à mettre ceci en place :
1. redirection ancienne page francophone

RewriteRule ^zdoc/fr_index.html$ /oklin2/zdoc/ok1_zdoc.php?lang=fr [L]

2. redirection par défaut sur page anglophone
RewriteRule ^zdoc.*$ /oklin2/zdoc/ok1_zdoc.php?lang=en [L]
(bon, peut-être un peu violent...) :roll:

3. générer sur chaque page dynamique du site
< base href = "url_complete_avec?lang=quivabien">
- sans l'espace entre < et base, bien entendu :lol:
parce que sinon il faut effectivement tout mettre en
absolu, y compris les liens <a href=#surlamemepage>

Encore des pièges ou je fonce ? :?

Vincent.
 
WRInaute passionné
Vincent,

Pourrais-tu nous donner les noms exacts des ancien fichiers, et ce par quoi ils sont remplacés.

Si tu veux faire une recirection permanente, il faut utiliser le flag [R=301] ainsi qu'ine URI complète en deuxième paramètre.

Exemple:
Code:
RewriteRule ^zdoc/fr_index.html$  http://www.tondomaine.tld/oklin2/zdoc/ok1_zdoc.php?lang=fr [R=301,L]

Dan
 
Nouveau WRInaute
Pour répondre à ta dernière réponse que j'aperçois juste au moment d'Envoyer :
- il ne s'agit pas vraiment d'une redirection
permanente, j'aime autant que l'ancienne URL reste valide comme point d'entrée.
- ancien fichier = par exemple /www/zdoc/fr_index.html et
/www/zdoc/index.html, deviennent l'un et l'autre
/www/oklin2/zdoc/ok1_zdoc.php?lang=fr (et ?lang=en)


Sinon j'ai mis le " " entre le < et le base. :lol:

J'ai fait les modifs sur mon site.
zdoc/fr_index.html$ , zdoc.*$ , lipsumcolor/fr_index.html$ et lipsumcolor.*$
sont "urlrewrités".

Je suppose qu'on peut appliquer la même manip à
/index.html et /fr_index.html .

Mais faut-il également le faire pour / (la racine tout court) ?

Dernière question: peut-on se servir de cette manip pour masquer
l'id de session PHP ? (que j'ai employé pour éviter l'envoi de cookies)
A mon avis non, mais ai-je tout compris ? :roll:

Vincent.
 
WRInaute passionné
Tu auras quelques difficultés à redirectionner la racine, comme tes pages nouvelles se trouvent justement dans un sous répertoire de cette même racine :wink:

Quant-aux identifiants de session, tu devrais pouvoir trouver sur le forum un petit script en php qui teste le useragent avant de lancer une session.
A la louche, c'est quelque chose comme:
Code:
$spiders = array("Googlebot", "crawler", "Slurp", "Fast","ia_archiver","Scooter","Robot","VoilaBot","W3C","ZyBorg","Deepindex","xecho"); 
$is_spider = false; 
foreach($spiders as $Val) 
{
    if (eregi($Val, $_SERVER["HTTP_USER_AGENT"])) 
    { 
       $is_spider = true; 
       break; 
    } 
} 

// Session 
ini_set("session.use_trans_sid", "0");
if(!$is_spider) {
     session_start();
}

Dan
 
Nouveau WRInaute
OK !

Merci pour tout, je suis content de cette journée de découverte
du monde étrange du référencement et de l'URL-rewriting.

Vincent.

:D
 
Nouveau WRInaute
Au fait...

J'ai écrit : il ne s'agit pas vraiment d'une redirection
permanente, j'aime autant que l'ancienne URL reste valide comme point d'entrée.

Mais est-ce que le fait d'avoir dans le source de la page qui apparaît
à l'URL ....zdoc/fr_index.html
un code < base href= autre chose que cette URL>

risque de perturber le référencement ? :roll:

Vincent.
 
Discussions similaires
Haut