corriger une erreur de redirection

Nouveau WRInaute
Bonsoir,
J'ai fait une belle bourde et je me retrouve avec plein d'erreurs 404.
J'avais des pages sur la racine de mon site. Ex: formation-access.php.
Et j'ai voulu les déplacer dans un dossier /formation.
J'ai utilisé le script PHP proposé dans l'article de WebRankInfo sur la redirection et j'ai placé ces codes dans les anciennes pages restées sur la racine, mais je ne sais pas pourquoi, les adresses de redirection n'ont pas pris l'extension php des fichiers.
Du coup, quand on clique sur l'url : www.intras.fr/formation-access.php, on est redirigé vers l'url www.intras.fr/formation/formation-access
alors que je voulais obtenir l'url complète : www.intras.fr/formation/formation-access.php
pour arriver sur les nouvelles pages

Je ne trouve pas moyen de corriger. J'ai tenté avec un htaccess dans le dossier formation :
RedirectPermanent /formation-access /formation-access.php

mais cela ne fonctionne pas.

J'ai renvoyé un nouveau sitemap à Google, mais les erreurs 404 sont toujours présentes...


Si quelqu''un peut m'aider à comprendre ce qui se passe, je le bénirai sur plusieurs générations :?
 
WRInaute discret
Tu aurais mieux fait de passer par htaccess directement en faisant ceci:

Code:
RewriteEngine on
RewriteRule ^formation-([a-z]+).php$ formation/formation-$1.php [R=301,L]

Ceci aurait fait l'affaire et devrait rétablir ton problème.
Penses à enlever toutes les choses inutiles (ou non fonctionnelles) ajoutées précédemment.
 
WRInaute passionné
autre solution htaccess, le redirectMatch Permanent :
Code:
RedirectMatch Permanent /formation/formation-access http://www.intras.fr/formation/formation-access.php
a placer à la racine (doit aussi fonctionner dans le répertoire /formation/, au choix)
(corrigé)
 
Nouveau WRInaute
Merci à Giustino et Longo,

J'ai effectivement fini par créer des redirect dans un .htaccess.

A noter une chose curieuse: j'avais laissé les anciennes pages en mettant une redirection en PHP vers les nouvelles pages. Ce code PHP de redirection était placé en haut de page et comportait un exit. Malgré cela, quand je suis allé dans les Outils pour Webmasters de Google, il a continué à comptabiliser les erreurs de balise TITLE en double sur les anciennes pages, pourtant redirigées...

:?: Dernière question : combien de temps dois-je laisser la redirection dans le htaccess ?
J'ai des liens provenant de sites extérieurs qui pointent vers les pages déplacées, mais je ne me vois pas les contacter un par un pour leur demander de modifier leur code...
 
WRInaute passionné
Il faut laisser les redirections … quasiment a vie … quelques années en tout cas.

A savoir qu'en règle général, Apache utilise le principe de PREMIER TROUVE = PREMIER REDIRIGE (VRAI ou FAUX, ligne par ligne).
La première ligne VRAI applique la règle, les suivantes sont ignorées. Je ne sais pas sur les autres serveurs ni en php, mais c'est comme cela dans le HTACCESS.

C'est a dire que dans un répertoire volumineux, si vous ne voulez pas tout rediriger, vous pouvez appliquer des règles précises pour les pages très importantes, puis a la fin, une règle générique pour tout le répertoire. Les règles non appliquées avant la générique finiront par atteindre cette dernière.

EX :
RedirectMatch Permanent /marubrique/maville1.html -http://mondomaine/marubrique/maville1.html
RedirectMatch Permanent /marubrique/maville2.html -http://mondomaine/marubrique/maville2.html
RedirectMatch Permanent /marubrique/maville3.html -http://mondomaine/marubrique/maville3.html
RedirectMatch Permanent /marubrique/(.*) -http://mondomaine/marubrique/index.html

Si maville4 n'est pas importante, je ridiregais ainsi toutes les autres (maville5, maville6, maville7 etc) vers la racine de ma rubrique.

le tiret devant http est juste pour le forum et il faut bien sur le retirer dans son htaccess.
 
WRInaute accro
longo600 a dit:
La première ligne VRAI applique la règle, les suivantes sont ignorées. Je ne sais pas sur les autres serveurs ni en php, mais c'est comme cela dans le HTACCESS.
Uniquement avec l'instruction [L] en fin de ligne.

Sinon au contraire, tout le fichier .htaccess est pris en compte
 
WRInaute passionné
Marie-Aude a dit:
Uniquement avec l'instruction [L] en fin de ligne.
Pas sur mes dédiés standard chez ovh en tout cas Marie-Aude. (sur realise2). J'ai testé et mis en place, ex :
sur le répertoire :
http://69-rhone.annuairefrancais.fr/cereales/vaulx-en-velin.html
http://69-rhone.annuairefrancais.fr/cereales/ampuis-2.html
http://69-rhone.annuairefrancais.fr/cereales/lyon.html
http://69-rhone.annuairefrancais.fr/cereales/rillieux-la-pape.html
et
http://69-rhone.annuairefrancais.fr/cereales/index-100.html

tu as bien une redirection différente pour chaque ville, et encore une autre pour tout le contenu du répertoire (placée à la fin).
Donc, c'est bien la première instruction VRAI qui est prise en compte dans ce cas. C'est peut-être différent sur d'autres serveurs.
Tu as raison de soulever une différence possible, il faut tester avant de mettre en production (surtout pour des gros sites).

le fichier htaccess dans ce répertoire (réduit) :
Code:
RedirectMatch Permanent /cereales/lyon(.*) http://cereales.annuairefrancais.fr/lyon/index.html
RedirectMatch Permanent /cereales/ampuis(.*) http://cereales.annuairefrancais.fr/ampuis/index.html
RedirectMatch Permanent /cereales/vaulx-en-velin(.*) http://cereales.annuairefrancais.fr/vaulx-en-velin/index.html
RedirectMatch Permanent /cereales/colombier-saugnieu(.*) http://cereales.annuairefrancais.fr/colombier-saugnieu/index.html
RedirectMatch Permanent /cereales/brindas(.*) http://cereales.annuairefrancais.fr/brindas/index.html
RedirectMatch Permanent /cereales/rillieux-la-pape(.*) http://cereales.annuairefrancais.fr/rillieux-la-pape/index.html
RedirectMatch Permanent /cereales/decines-charpieu(.*) http://cereales.annuairefrancais.fr/decines-charpieu/index.html
RedirectMatch Permanent /cereales/dieme(.*) http://cereales.annuairefrancais.fr/dieme/index.html
RedirectMatch Permanent /cereales/joux(.*) http://cereales.annuairefrancais.fr/joux/index.html
RedirectMatch Permanent /cereales/saint-appolinaire(.*) http://cereales.annuairefrancais.fr/saint-appolinaire/index.html
RedirectMatch Permanent /cereales/saint-clement-sur-valsonne(.*) http://cereales.annuairefrancais.fr/saint-clement-sur-valsonne/index.html
RedirectMatch Permanent /cereales/saint-marcel-l-eclaire(.*) http://cereales.annuairefrancais.fr/saint-marcel-l-eclaire/index.html
RedirectMatch Permanent /cereales/les-sauvages(.*) http://cereales.annuairefrancais.fr/les-sauvages/index.html
RedirectMatch Permanent /cereales/tarare(.*) http://cereales.annuairefrancais.fr/tarare/index.html
RedirectMatch Permanent /cereales/valsonne(.*) http://cereales.annuairefrancais.fr/valsonne/index.html
RedirectMatch Permanent /cereales/l-arbresle(.*) http://cereales.annuairefrancais.fr/l-arbresle/index.html
RedirectMatch Permanent /cereales/bully(.*) http://cereales.annuairefrancais.fr/bully/index.html
RedirectMatch Permanent /cereales/chevinay(.*) http://cereales.annuairefrancais.fr/chevinay/index.html
RedirectMatch Permanent /cereales/fleurieux-sur-l-arbresle(.*) http://cereales.annuairefrancais.fr/fleurieux-sur-l-arbresle/index.html
RedirectMatch Permanent /cereales/lentilly(.*) http://cereales.annuairefrancais.fr/lentilly/index.html
RedirectMatch Permanent /cereales/sain-bel(.*) http://cereales.annuairefrancais.fr/sain-bel/index.html
RedirectMatch Permanent /cereales/(.*) http://cereales.annuairefrancais.fr/69-rhone-dept/index.html
 
WRInaute accro
WRInaute passionné
Marie-Aude a dit:
Ta première règle transforme l'url. Donc la "nouvelle" url ne correspond pas aux règles de réécritures, donc elle n'est PLUS réécrite.
Maintenant si dans la suite de tes redirect tu avais, par exemple
RedirectMatch Permanent /cereales/sain-bel(.*) http://annuairefrancais.fr/cereales/toto-sain-bel/index.html
Marie-Aude, tu veux me faire griller mes neurones ? :roll:
je viens de tout restructurer :
- Dept.NDD/rubrique/ville (ou index) devient
- Rubrique.NDD/dept/ ou Rubrique.NDD/ville/

Avec la dernière règle
Code:
RedirectMatch Permanent /cereales/(.*) http://cereales.annuairefrancais.fr/69-rhone-dept/index.html
toutes les règles précédentes sont fonctionnelles si elles correspondent a VRAI, sinon, c'est cette dernière qui fait le travail.
Si je mettais cette règle en premier, aucune des autres ne seraient prise en compte puisque la 1ere était VRAI! (je vais tester qq même).

Dans mon cas, je veux rediriger:
- rubriques/villex.html => rubrique/villex/index.html et
- rubrique/index-X.html => rubrique/dept/index.html

Tout ce qui n'est pas ville (chaque ligne htaccess) est donc département (dernière ligne htaccess),
Donc effectivement /cereales/toto-sain-bel/index.html qui n'existe pas serait bien réécrit en http://cereales.annuairefrancais.fr/69-rhone-dept/index.html puisque tout ce qui est dans /cereales/ , si non appliqué les lignes avant, sera redirigé vers /cereales/dept/.

Je n'ai pas compris la différence et la nécessité de mettre un L en plus? (ou en moins).
 
WRInaute passionné
Voilà, le test est en place :
Code:
RedirectMatch Permanent /cereales/(.*) http://cereales.annuairefrancais.fr/69-rhone-dept/index.html
a été mis en 1er juste quelques minutes pour tester en réel.

Du coup, toutes les règles suivantes ne sont pas prises en compte, puisque la première règle est VRAI sur une url par ex :
http://69-rhone.annuairefrancais.fr/cereales/chevinay.html , je ne suis plus redirigé vers une ville, mais vers le dept .
Si je remet cette ligne en dernier, si j'ai une ligne avec une redirection vers cette ville avant, la redirection marchera précisément pour cette ville.

J'en déduit que la 1ère règle VRAI l'emporte sur toutes les suivantes.
modif 19h20 => test supprimé
 
WRInaute accro
Ce n'est pas le test qui correspond à ce que je t'ai mis.

Si tu fais comme les newbies qui ne savent pas recopier un code informatique où va t on ?


Ta première règle correspond à une redirection d'un sous répertoire de annuairefrançais.fr en un sous-domaine.
A partir de ce moment, l'url réécrite ne correspond PLUS au sous répertoire initial. Il n'y a donc plus de règles VRAIES

En revanche, et contrairement à ce que tu as dis, le htaccess ne s'arrête pas à la première règle vraie si on ne lui met pas en fin de ligne l'instruction [L]

Donc teste
RedirectMatch Permanent /cereales/sain-bel(.*) http://69-rhone.annuairefrancais.fr/cereales/toto-sain-bel/index.html
RedirectMatch Permanent /cereales/toto-sain-bel(.*) http://cereales.annuairefrancais.fr/toto-sain-bel/index.html

Et tu verras bien que les deux règles sont exécutées l'une après l'autre



(et demandes toi pourquoi on aurait une instruction inutile)

Teste exactement ce que je t'ai mis
 
WRInaute accro
autre exemple :

si tes règles sont les suivantes :
Règle 1 : toutes les villes commençant par A sont renommées en B + nom de la ville
Règle 2 : toutes les villes commençant par B sont renommées en C + nom de la ville
Règle 3 : toutes les villes commençant par AB sont renommées en D + nom de la ville
Règle 4 : toutes les villes commençant par BA sont renommées en E + nom de la ville
Règle 5 : toutes les villes commençant par CB sont renommées en F + nom de la ville

Selon tes dires, une ville telle que Abbeville sera renommée en BAbbeville et puis c'est tout.

Ce qu'on veut te prouver c'est qu'au final ça sera FCBAbbeville

Ensuite imagine que tu mettes (L) pour la règle 2. Le résultat final sera CBAbbeville
 
WRInaute passionné
Désolé, un peu surbooké et pas eut le temps de répondre dessuite.

Je me suis mal exprimé, si la condition est vrai sur une ligne, elle est exécuté. Tu as raison de dire que les lignes suivantes sont testées quand même, même si cela n'a aucune raison d'exister, si l'on rend la règle suivante aussi VRAI a chaque fois, elle sera exécuté à chaque ligne si cette instruction est à nouveau dans le même répertoire, évidement.

Ce que je voulais dire, c'est que si l'on a deux règles VRAI, du moment que l'on change de répertoire, ce sera la première règle qui sera prise en compte.
C'est pratique si l'on veut déplacer certaines pages précises et en paquet toutes les autres;
- les pages précises en 1er ligne par ligne
- tous le reste en paquet sur tous le répertoire restant, avec une seule ligne.

Sommes-nous d'accord?

Je n'ai pas testé le [L] en fin de ligne pour vérifier si l'instruction arrête ou non le processus d'application des lignes, je te crois sur parole.
 
WRInaute accro
longo600 a dit:
Ce que je voulais dire, c'est que si l'on a deux règles VRAI, du moment que l'on change de répertoire, ce sera la première règle qui sera prise en compte.
Cette formulation induit en erreur.

Si on a deux règles vraies, alors si la première règle fait que la seconde n'est plus vraie, seule la première sera exécutée.
Le changement de répertoire n'a rien à voir, il est purement "anecdotique", lié à ta structure de réécriture dans ton cas précis.
 
WRInaute passionné
Marie-Aude a dit:
Cette formulation induit en erreur.
… et celle-ci aussi Marie-Aude … sourire.

En fait, celui qui met deux règles qui peuvent êtres vraies, il peut se poser la question de laquelle sera exécutée …
D'où mon propos bien sûr conditionnel. Je n'ai pas trouvé vraiment de réponse et d'éclaircissement sur cette question en Français.
Est-ce la dernière ligne ou la première?

- La première ligne vrai est donc exécutée … si l'opération rend les lignes suivantes fausses par exemple en changeant de répertoire dans lequel le fichier htaccess éventuel ne retraite pas a nouveau la redirection.
Si la redirection reste au même niveau, et donc, est toujours concernée par le même fichier htaccess, la nouvelle url sera retraitée par le fichier htaccess.

Selon ton exemple, en ayant comme directives de redirection :
Code:
RedirectMatch Permanent /cereales/sain-bel(.*) -http://NDD/cereales/page.html
RedirectMatch Permanent /cereales/(.*) -http://NDD2/69-rhone-dept/index.html
Alors là oui,en tapant -http://NDD/cereales/sain-bel.html je finirais dans NDD2. Mais ce n'est pas mon propos .

j'ai testé le [L] en fin de ligne, attaché et en minuscule, ça ne change rien, les 2 lignes ci-dessus sont exécutée, et avec un espace ( ereales/page.html [L] ), cela met le serveur en erreur interne. Ce sont peut-être des commandes réservées au php et pas pour le htaccess, en tout cas sur mon serveur dédié OVH.
 
WRInaute accro
longo600 a dit:
Marie-Aude a dit:
Cette formulation induit en erreur.
… et celle-ci aussi Marie-Aude … sourire.

En fait, celui qui met deux règles qui peuvent êtres vraies, il peut se poser la question de laquelle sera exécutée …
D'où mon propos bien sûr conditionnel. Je n'ai pas trouvé vraiment de réponse et d'éclaircissement sur cette question en Français.
Est-ce la dernière ligne ou la première?

Toutes les règles sont lues et évaluées à la suite les unes des autres.
Quand une règle répond à une condition vraie, elle est appliquée
Quand une règle répond à une condition fausse, elle n'est pas appliquée

Si une règle n°1 est appliquée, et que l'url transformée répond ensuite à la condition de la deuxième règle, la deuxième est aussi appliquée.

C'est pourquoi il est important de mettre le [L] car cela réduit la charge serveur en évitant de tester toutes les règles, les unes après les autres.

Il y a énormément de documents en français qui expliquent le fonctionnement htaccess

Par exemple celui ci http://openweb.eu.org/articles/le-fichier-htaccess qui précise bien

Vous aurez noté le [R=301,L] à la fin de la ligne. Ce sont des drapeaux (flags) de réécriture. Ils ajoutent des directives à la réécriture, dans notre exemple, le R=301 indique que la réécriture est une redirection permanente. Le L (comme Last, dernier en anglais) indique que le serveur n’a pas besoin de lire les autres règles si celle-ci est satisfaite.

ce qui veut bien dire que, a contrario, si il n'y a pas ce fameux flag [L] le serveur continue à lire et tester les autres règles
 
WRInaute passionné
Merci Marie-Aude de ce lien. Comme je n'ai pas l'url rewriting fonctionnelle sur mon serveur, je ne peux pas tester (c'est un peu la galère sur la gentoo modifié par ovh - et c'est plus simple sur mac).
Dans le cas de l'url rewriting, effectivement, le [L]à la fin d'une ligne (ou [R=301,L] permet de stopper la lecture, sinon, même si une règle est vraie, la lecture se fait jusqu'à la fin du fichier htaccess, ce qui peut ralentir le serveur dans le cas de nombreuses redirections.

J'ai donc été un peu trop imprécis en disant que les autres lignes sont ignorées, le principe que j'évoquais étais de mettre en premier les urls a rediriger une à une, puis ensuite une règle applicable a toutes les autres.
 
Discussions similaires
Haut