Probleme redirection 301

Nouveau WRInaute
Bonjour, j'ai mis en place une url rewriting qui marche tres bien, le souci et la redirection 301: j'ai essaye de mettre a la fin de chaque ligne L,R=301 , mais dans ce cas il a l'effet inverse c'est a dire que la page simplifié redirige vers la complexe...

quel est donc le code correct dans cet exemple, pour redirigé en 301 l'ensemble de reecriture.

Code:
Options +FollowSymlinks
RewriteEngine on
RewriteRule ^page1$ /?page=complexe1
RewriteRule ^page2$ /?page=complexe2
RewriteRule ^page3$ /?page=complexe3
RewriteRule ^page4$ /?page=complexe4
RewriteRule ^page5$ /?page=complexe5 [L]

merci
 
WRInaute accro
Bon, parce que j'ai le même souci avec Sivit, quand je mentionne une redirection 301 dans une règle de réécriture, il affiche l'Url non réécrite dans la barre d'adresse.
 
WRInaute accro
essaye avec le flag QSA pour forcer la substitution de la chaine.

Code:
RewriteRule ^page1$ http://www.tonsite.com/?page=complexe1 [QSA,R=301,L]
 
WRInaute accro
negostock a dit:
mais dans ce cas il a l'effet inverse c'est a dire que la page simplifié redirige vers la complexe...

Normal, tes règles sont écrites à l'envers...


-->

Code:
RewriteEngine On
RewriteRule ^view.php?foo=bar$ /foo-bar.html [QSA,L,R=301]
 
Nouveau WRInaute
Mes regles ne sont pas ecrites à l'envers...

le format est bien:
Code:
RewriteRule ^url-ok$ /url_complexe

Et j'ai bien essayé de placer la balise QSA mais meme probleme, des que je met la balise r=301 , ca inverse ma reecriture
 
WRInaute accro
Si ce code ne marche pas, contact ton hebergeur.

Code:
RedirectMatch 301 ^page1$ http://www.tonsite.com/?page=complexe1
 
Nouveau WRInaute
Ca n'a pas l'air de fonctionner, mais il y a peut etre une erreur de syntaxe, qu'en pensez vous?

Code:
Options +FollowSymlinks 
RewriteEngine on 
RewriteRule ^page1$ /?page=complexe1 
RewriteRule ^page2$ /?page=complexe2 
RewriteRule ^page3$ /?page=complexe3 
RewriteRule ^page4$ /?page=complexe4
RedirectMatch 301 ^page4$ http://www.monsite.com/?page=complexe4
RewriteRule ^page5$ /?page=complexe5 [L]

merci
 
WRInaute passionné
Est-ce que tu peux détailler ce que tu veux faire car ce n'est pas très clair.

j'ai essaye de mettre a la fin de chaque ligne L,R=301 , mais dans ce cas il a l'effet inverse c'est a dire que la page simplifié redirige vers la complexe.

Si tu mets une redirection 301, c'est normal que tu sois redirigé vers la nouvelle page

Code:
RewriteEngine on
RewriteRule ^page5$ /?page=complexe5 [L]

Que se passe t'il si tu clique sur example.com/page5 ?
Normalement tu affiches le contenu de /?page=complexe5 ?
Si oui, c'est ce que dois faire ton htaccess, donc pas de probleme.
Sinon essaye sans le followsymlink si tu n'en as pas besoin.
 
Nouveau WRInaute
En fait pour ca pas de probleme,

en effet j'avais deja mis en place l'url rewrite, soit quand je tape l'adresse simplifié c'est le contenu de la complexe qui s'affiche.

Le souci est sur la redirection 301, soit quand je tape l'ancienne url etre redirigé automatiquement vers la nouvelle url, mais le souci est que si je met la balise r=301 en fin de ligne, quand je tape mon adresse simplifié dans la barre d'adresse, je me retrouve automatiquement dirigé vers l'adresse complexe...
 
WRInaute passionné
negostock a dit:
Le souci est sur la redirection 301, soit quand je tape l'ancienne url etre redirigé automatiquement vers la nouvelle url, mais le souci est que si je met la balise r=301 en fin de ligne, quand je tape mon adresse simplifié dans la barre d'adresse, je me retrouve automatiquement dirigé vers l'adresse complexe...

Normal, comme dis précédemment, si tu veux aller de ton adresse complexe vers ton adresse simple, ta réécriture est à l'envers.
Dans ce cas, tu dois avoir une redirection d'une page
page.php?query=toto
vers la page (c'est un exemple)
page-query-toto.php

Afin de récupérer le toto, il faut que tu testes la présence de l'argument par une rewritecond

Trouvé au hasard sur le net
Code:
RewriteCond %{query_STRING} ^(.+)\?full=1$
RewriteRule ^view_photo\.php$ http://www.example.com/view_photo-%1 [R=301,L]

qui redirige quelquechose?full=1
vers
http://www.example.com/view_photo-quelquechose

Pas sur que ca marche mais c'est un truc de ce genre.

Le symlink de ton htaccess te sert il vraiment ?
 
WRInaute accro
A mon avis tout n'est pas très clair...



Cas d'une redirection:
Code:
RewriteEngine On
RewriteRule ^view.php?foo=bar$ /foo-bar.html [QSA,L,R=301]

...avec les regex:
Code:
RewriteRule ^view.php?var=(.*)$ /var-$1.html [QSA,L,R=301]

--> Toute url affichée dans le navigateur, de type "/view.php?var=[...]" est redirigée vers l'URL correspondante de type "/view-var.html"

Utilité: se débarrasser des urls "complexes" indexées par le moteur au bénéfice de leur pendant "réécrit".



Cas d'une réécriture:
Code:
RewriteEngine On
RewriteRule ^foo-bar.html$ /view.php?foo=bar [L]

...avec les regex:
Code:
RewriteRule ^var-$1.html$ /view.php?var=$1 [L]

--> Toute url affichée dans le navigateur, de type "/view-var.html" fait afficher par le serveur le contenu de l'URL correspondante de type "/view.php?var=[...]" (l'adresse dans la barre d'adresse reste la même).

Utilité: URL-rewriting: afficher des URLs simples et "statiques" pour un contenu appelé de manière dynamique.
 
WRInaute passionné
ca marche la réecriture quand on a un parametre ?
le parameter ne fait pas partie de l'url je crois ?
je me trompe peut-etre, mais je pensais qu'il fallait passer par un test de Query string ?
 
WRInaute accro
nickargall a dit:
Bon, parce que j'ai le même souci avec Sivit, quand je mentionne une redirection 301 dans une règle de réécriture, il affiche l'Url non réécrite dans la barre d'adresse.

Et tu as contacter Sivit pour leur demander si c'etait normal ? Je sais que beaucoup de serveurs avec le rewrite ont un encoding differents des schemas classiques. Voir online.net par exemple, si tu met Options FollowSymLinks dans le .htaccess, ca plante direct!! Ils disent que ca fidelise le client de faire different, je vois pas trop comment en nous cassant les co... mais il parait que ca marche.
 
WRInaute passionné
negostock a dit:
donc moi ce qui m'interesse c'est une redirection apres reecriture...

Ce que tu appelles réécriture n'est pas de la réécriture.

La réécriture, ca concerne le contenu de la page. pas l'adresse de la page dans la barre du navigateur.
Si tu vuex changer l'adresse de la page, tu rediriges.

En gros, tu veux

Que quand on tape
/mapage/ on voit le contenu de toto.php?fich=mapagedfsdfs tout en ayant l'adresse /mapage/ dans l'url -> réécriture

et que quand on tape
toto.php?fich=mapagedfsdfs on soit redirigé vers /mapage/
C'est à dire qu'on voit l'url propre et le contenu de la page toto.php?fich=mapagedfsdfs -> redirection (a priori 301)

Pour faire cela: enlève le option symlink qui ne te sert à rien. Tu es sur un hébergement mutualisé donc certaines options ne marchent pas.

Fais une regle de réécriture
Code:
RewriteRule ^mapage/$ /toto.php?fich=mapagedfsdfs [L]
et une redirection
Code:
RewriteCond %{query_STRING} ^fich=mapagedfsdfs$
RewriteRule ^toto\.php$ http://www.example.com/mapage/ [R=301,L]
 
Nouveau WRInaute
ok je commence a bien comprendre le fonctionnement, cependant il y a encore un souci...y a t-il une erreur dans mon code?

Code:
RewriteRule ^simple$ /?page=complexe [L]
RewriteCond %{query_STRING} ^page=complexe$ 
RewriteRule ^/?$ http://www.mapage.com/simple/ [R=301,L]

En tout cas encore merci pour votre aide
 
WRInaute accro
Suede a dit:
Fais une regle de réécriture
Code:
RewriteRule ^mapage/$ /toto.php?fich=mapagedfsdfs [L]
et une redirection
Code:
RewriteCond %{query_STRING} ^fich=mapagedfsdfs$
RewriteRule ^toto\.php$ http://www.example.com/mapage/ [R=301,L]

[mode boulet]
le moteur rewrite ne va t-il pas pointer sur la premiere instruction valide, l'executer et sortir du script sans executer le reste ?
[/mode boulet]
 
WRInaute passionné
Essaye :

Code:
RewriteRule ^simple$ /?page=complexe [L]
RewriteCond %{query_STRING} ^page=complexe$
RewriteRule ^$ http://www.monsite.com/simple [R=301,L]
(avec le [L] )
ou

Code:
RewriteCond %{query_STRING} ^page=complexe$
RewriteRule ^$ http://www.monsite.com/simple [R=301,L]
RewriteRule ^simple$ /?page=complexe [L]
 
WRInaute accro
Doc Apache:
'last|L' (last rule)
Stop the rewriting process here and don't apply any more rewrite rules.

Suede a dit:
Essaye :

Code:
RewriteRule ^simple$ /?page=complexe [L]
RewriteCond %{query_STRING} ^page=complexe$
RewriteRule ^$ http://www.monsite.com/simple [R=301,L]
(avec le [L] )

il n'execute pas la seconde instruction puisque tu met le flag L

Suede a dit:
Code:
RewriteCond %{query_STRING} ^page=complexe$
RewriteRule ^$ http://www.monsite.com/simple [R=301,L]
RewriteRule ^simple$ /?page=complexe [L]

Eventuellement mais dans ce cas retire le L encore une fois sinon il va sortir. R=301 et c'est tout

perso, je vois pas ou est le lezard depuis le debut, chez moi RedirectMatch réécris et redirige tres bien en 301.

Code:
RedirectMatch 301 ^page$ http://www.tonsite.com/?page=complexe
 
WRInaute accro
Et comme ça ?

Code:
#Si query string -> redirection
RewriteCond %{query_STRING} ^page=complexe$
RewriteRule ^$ http://www.monsite.com/simple [R=301,L]

#Gestion de la réécriture
RewriteRule ^simple$ /?page=complexe [L]
 
WRInaute passionné
KOogar a dit:
Suede a dit:
Code:
RewriteCond %{query_STRING} ^page=complexe$
RewriteRule ^$ http://www.monsite.com/simple [R=301,L]
RewriteRule ^simple$ /?page=complexe [L]

Eventuellement mais dans ce cas retire le L encore une fois sinon il va sortir. R=301 et c'est tout

perso, je vois pas ou est le lezard depuis le debut, chez moi RedirectMatch réécris et redirige tres bien en 301.

Code:
RedirectMatch 301 ^page$ http://www.tonsite.com/?page=complexe

Il le stoppera mais comme il refait appel à la page en R=301, il repassera un coup (a partir du debut).
 
WRInaute accro
Alternative, alors:

Est-ce que tes URLs 'propres' sont gérés par une fonction?

J'utilise ça sur mes pages réécrites pour empêcher l'accès aux pages "sources" (les "index.php?var=truc), et donc rediriger [301] ces pages vers leur équivalent "réécrit" (index-var-truc.html):

En début de script, comme je connais les variables, je génère un URI de contrôle. Si cet URI de contrôle n'est pas égal à $_SERVER['REQUEST_URI'], je redirige vers l'URI de contrôle...

Code:
<? 
// PREVENTING DUPLICATE CONTENT
$shouldbe_URI	=	'/'.$foo.'/'.REWRITER($bar).'.html';

if($_SERVER['REQUEST_URI'] != $shouldbe_URI)
	{
	header("Status: 301 Moved Permanently", false, 301);
	header("Location: http://example.com".$shouldbe_URI."");
	exit;
	}
?>

--> ça te dégagerait de devoir faire les redirections via .htaccess, il ne resterait plus que la règle de rewriting.
 
Discussions similaires
Haut