Redirection d'une URL sans / à la fin vers une avec le / ...

  • Auteur de la discussion Auteur de la discussion bucheron
  • Date de début Date de début
WRInaute discret
Bonjour,

j'essaye de créer une règle et j'avoue que je ne suis pas encore un expert dans le domaine donc je demande votre aide.
Désolé si la question à déjà été posé.

voila la règle que je souhaiterais établir:

toutes les URLs ne se terminant pas par / ou .html les rediriger avec la meme URL mais avec un / à la fin

voila ce que ça donne:

monsite.com/tutu/toto => monsite.com/tutu/toto/
par contre

monsite.com/tutu/toto.html ou
monsite.com/tutu/toto/
ne sont pas redirigé

tout simplement.

j'ai commencé en faisant ça:

Code:
RewriteRule ^(([a-zA-Z]|[-])*)$ 				/$1/		[R=301]
Ca fonctionne très bien à un niveau or à plusieurs niveau ça merde.

Donc si quelqu'un aurait un règle générique ce serait super sympas.

D'avance merci.

PS: Pour les curieux je souhaite cette modif pour des raisons de référencement.
 
WRInaute discret
je ne sais pas trop pour ta règle mais je t'invite à lire ce sujet: https://www.webrankinfo.com/forum/t/format-du-backlink-avec-ou-sans-slash.93989/ qui aborde le point du "/" en fin d'URL et qui semble dire que ça ne sert pas à grand chose de l'ajouter s'il n'est pas là

sinon je n'ai pas compris pourquoi tu veux réécrire tes URL avec un "/" à la fin, si tes visiteurs saisissent l'URL sans / ils arrivent de toutes façon sur la même page, non?
 
WRInaute discret
Lomic2 a dit:
je ne sais pas trop pour ta règle mais je t'invite à lire ce sujet: https://www.webrankinfo.com/forum/t/format-du-backlink-avec-ou-sans-slash.93989/ qui aborde le point du "/" en fin d'URL et qui semble dire que ça ne sert pas à grand chose de l'ajouter s'il n'est pas là

sinon je n'ai pas compris pourquoi tu veux réécrire tes URL avec un "/" à la fin, si tes visiteurs saisissent l'URL sans / ils arrivent de toutes façon sur la même page, non?

non, les URLs sans / accèdent à une 404.
Et la redirection permet que si n'importe quel site fais un backlink sur une URL de mon site avec ou sans / l'url de la page finale est la meme.
A l'inverse si on ne le fais pas. Il y a possibilité de duplicate content.
 
WRInaute discret
webmasterlamogere a dit:
si il s'agit d'un répertoire physique tu peux faire :
Code:
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*[^/])$	/$1/ [L]

Malheureusement ce sont des répertoire virtuels.

J'ai quand meme testé le code et à la place de l'option L j'ai mis une redirection 301.
Et comme tu l'as dit ça n'a pas fait le travail demandé.

Meme si je trouve ton idée top et que je n'ai pas compris pourquoi il ne fonctionne pas si ce n'est pas un rep physique.

De plus il faudrait rajouter dans la règle sans / et .html à la fin
 
WRInaute passionné
Si tu as une règle de réécriture qui gère les .html tu peux supprimer la première ligne.
Code:
RewriteRule \.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*[^/])$   /$1/ [R=301,L,QSA]
la première ligne indique que si l'url se termine par .html, on ne fait pas de réécriture (signe -) et on s'arrete (flag L)
La deuxième ligne indique qu'on test que l'url ne correspond pas à un répertoire (!-d) pour appliquer la règle suivante.
La dernière ligne indique que l'url ne se termine pas par un /
 
WRInaute impliqué
Essaie celle ci:

Code:
RewriteCond $1 !html$
RewriteRule ^(.*[^/])$   $1/ [L]
 
WRInaute discret
je viens de tester les 2 solutions.

La 1ere fonctionne mais uniquement pour 1 niveau.
Le problème c'est qu'au niveau suivant c'est le plantage complet vu qu'on s'arrete au 1er slash rencontrer

la 2e soution fonctionne presque j'ai du un peu la changer
Code:
RewriteCond $1 !html$
RewriteRule ^(.*[^/])$   /$1/ [R]

pour combler le problème du 1er niveau j'ai essayé ça
Code:
RewriteRule \.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)[^/]$   /$1/ [R=301,L,QSA]

mais la ça plante complet.

Une idée ?
 
WRInaute impliqué
Je ne suis pas sûr de comprendre.

Est-ce que ta modification de ma règle fonctionne?

Merci.
 
WRInaute discret
t es modifications fonctionnent en faisant une légère adaptation

Code:
RewriteCond $1 !html$
RewriteRule ^(.*[^/])$   /$1/ [R]

Par contre ça ne marche que pour 1 seul niveau.
Ex:

monsite.com/toto => ça marche
monsite.com/toto/tutu => ça ne marche pas
 
WRInaute discret
dans le 2e cas ça me ramène à la page sans réecriture d'url .

Exemple
monsite.com/toto/tutu => monsite.com/toto/tutu.php

La page physique sur le serveur
 
WRInaute passionné
tu veux dire que le fichier monsite.com/toto/tutu.php existe?
si c'est ça c'est surement un problème de négociation de contenu actif. essaye d'ajouter la ligne :
Code:
Options -MultiViews
 
WRInaute discret
non malheureusement c'est pas ça.
J'ai donner un mauvais exemple

monsite.com/toto/tutu => monsite.com/toto/fiche.php?page=tutu

en gros il n'y pas de lien directe entre la page affiché et la page réelle.
 
WRInaute discret
bon j'ai essayé de faire une version concis de mon htaccess (j'ai enlever plusieurs partis).
Code:
RewriteEngine On

Options -MultiViews
RewriteRule ^(.*\.(css|js|gif|jpg))$ $1 [L]

RewriteCond $1 !html$
RewriteRule ^(.*[^/])$   /$1/ [R]

RewriteRule ^logiciels/$ 				/path.../annuaire/editeur/ [L] 
RewriteRule ^logiciels/(.*)/$			      /path.../annuaire/editeur/fiche.php?url=$1 [L]

ErrorDocument 404 /errors/not-found.php

en gros si j'accède à:

http://localhost/logiciels => ça me redirige bien vers http://localhost/logiciels/
http://localhost/logiciels/ => Aucun pb

le problème vient si j'accède à:
http://localhost/logiciels/editeur1 ou http://localhost/logiciels/editeur1/

le serveur me redirige vers:
http://lemonade/path.../annuaire/editeu ... l=editeur1

Vous noterez également le / après fiche.php, qui je pense, est rajouté par la nouvelle règle.
Si cette règle est enlevé tout fonctionne correctement à part bien sur cette fameuse redirection.
 
WRInaute passionné
tu peux essayer ça :
Code:
RewriteEngine On

Options -MultiViews
RewriteRule ^(.*\.(css|js|gif|jpg))$ $1 [L]

RewriteRule ^logiciels$             /logiciels/ [R=301,L] 
RewriteRule ^logiciels/$             /path.../annuaire/editeur/ [L]
RewriteRule ^logiciels/(.*)/$               /path.../annuaire/editeur/fiche.php?url=$1 [L]

RewriteCond $1 !html$
RewriteRule ^logiciels/(.*)$               /logiciels/$1/ [R=301,L]

ErrorDocument 404 /errors/not-found.php
 
WRInaute discret
En effet cela fonctionne.

Mais il y a un problème de taille:

le htaccess que j'ai fournis n'est qu'un extrait du véritable htaccess.
Donc il y a beaucoup de règle de ce type.

De plus avec la règle précédemment définis, je ne sais pas pourquoi mais si je joins les 2 cela ne fonctionne plus
Code:
RewriteRule ^(.*[^/])$   /$1/ [R] 
RewriteRule ^logiciels/(.*)$               /logiciels/$1/ [R=301,L]

De plus à un endroit j'ai des répertoires virtuels ou le nombre n'est pas fixé (c'est une liste de catégories et de sous catégories )

N'y a t il pas une règle ou option à activer pour régler ce genre de problème.
 
WRInaute impliqué
Le comportement que tu as est normal, la règle ci dessous en est la cause:

Code:
RewriteRule ^logiciels/(.*)/$               /path.../annuaire/editeur/fiche.php?url=$1 [L]

Elle récrit -http://localhost/logiciels/editeur1/ en -http://lemonade/path.../annuaire/editeur/fiche.php?url=editeur1

SI tu ne veux pas de cette réécriture, enlève cette règle.
 
WRInaute discret
je crois que tu n'as pas bien compris mon pb.

en fait cette règle est bonne mais dans le cas des 2 règles cela me fait une REDIRECTION et non une réecriture d'ou le problème.
Alors qu'en fin de ligne je met l'option [L]

c'est ça que je ne comprend pas.
 
WRInaute impliqué
bucheron a dit:
je crois que tu n'as pas bien compris mon pb.

J'en suis sûr (de ne pas comprendre ton problème).

Peux tu donner un ensemble d'URL avec pour chacune:
- l'URL entrée dans le navigateur
- l'URL que tu veux voir apparaitre dans la barre d'adresse du navigateur
- le contenu que tu veux afficher


Par exemple

-http://mondomaine.com
-http://www.mondomain.com/
-http://www.mondomain.com/index.php?page=0

C'est plus utile de décrire ce que tu veux plutôt que de décrire ce que tu ne veux pas.
 
WRInaute discret
ok je vais essayer de résumer

voila ce que je veux:

http://localhost/logiciels => http://localhost/logiciels/ (Redirection)
http://localhost/logiciels/ => OK
http://localhost/logiciels/editeur1 => http://localhost/logiciels/editeur1/ (Redirection)
http://localhost/path/path/path => http://localhost/path/path/path/ (Redirection)
http://localhost/path/path/path/ => OK

Voila ce que je ne veux pas:

Si j'accède à
http://localhost/logiciels/editeur1 ou http://localhost/logiciels/editeur1/
on me REDIRIGE vers
http://localhost/path.../annuaire/edite ... l=editeur1
Et c'est ce qui est le cas si je met les 2 règles or comme je disais je ne comprend pas vu que j'ai l'option L et non R à la fin de cette règle:
Code:
RewriteRule ^logiciels/(.*)/$               /path.../annuaire/editeur/fiche.php?url=$1 [L]
 
WRInaute impliqué
A aucun moment tu dis que tu veux une réécriture vers fiche.php

Donc pourquoi as tu une règle qui le fait?

Il manque probablement une partie de ce que tu veux...
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut