Empêcher les majuscules dans les URL

WRInaute discret
Bonjour à tous

Suite à un audit fait par une personne externe au site que je tiens, il m'a été signalé que le site "ne force pas les URL en minuscule ce qui est important pour que google ne voit pas de nombreuses de nos pages comme des erreurs".

J'ai donc cherché sur le net et trouvé le code pour le faire :

Code:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule [A-Z] - [E=HASCAPS:TRUE,S=1]
RewriteRule ![A-Z] - [S=28]
RewriteRule ^([^A]*)A(.*)$ $1a$2
RewriteRule ^([^B]*)B(.*)$ $1b$2
RewriteRule ^([^C]*)C(.*)$ $1c$2
RewriteRule ^([^D]*)D(.*)$ $1d$2
RewriteRule ^([^E]*)E(.*)$ $1e$2
RewriteRule ^([^F]*)F(.*)$ $1f$2
RewriteRule ^([^G]*)G(.*)$ $1g$2
RewriteRule ^([^H]*)H(.*)$ $1h$2
RewriteRule ^([^I]*)I(.*)$ $1i$2
RewriteRule ^([^J]*)J(.*)$ $1j$2
RewriteRule ^([^K]*)K(.*)$ $1k$2
RewriteRule ^([^L]*)L(.*)$ $1l$2
RewriteRule ^([^M]*)M(.*)$ $1m$2
RewriteRule ^([^N]*)N(.*)$ $1n$2
RewriteRule ^([^O]*)O(.*)$ $1o$2
RewriteRule ^([^P]*)P(.*)$ $1p$2
RewriteRule ^([^Q]*)Q(.*)$ $1q$2
RewriteRule ^([^R]*)R(.*)$ $1r$2
RewriteRule ^([^S]*)S(.*)$ $1s$2
RewriteRule ^([^T]*)T(.*)$ $1t$2
RewriteRule ^([^U]*)U(.*)$ $1u$2
RewriteRule ^([^V]*)V(.*)$ $1v$2
RewriteRule ^([^W]*)W(.*)$ $1w$2
RewriteRule ^([^X]*)X(.*)$ $1x$2
RewriteRule ^([^Y]*)Y(.*)$ $1y$2
RewriteRule ^([^Z]*)Z(.*)$ $1z$2
RewriteRule [A-Z] - [N]
RewriteCond %{ENV:HASCAPS} TRUE
RewriteRule ^/?(.*) /$1 [R=301,L]
</IfModule>

Cela marche parfaitement pour les urls de type
https://www.monsite.com/mapage.html

Malheureusement pas du tout pour les pages de type
https://www.monsite.com/sousdossier/mapage.html

Comment régler ce problème ?

Merci d'avance
 
WRInaute passionné
Suite à un audit fait par une personne externe au site que je tiens, il m'a été signalé que le site "ne force pas les URL en minuscule ce qui est important pour que google ne voit pas de nombreuses de nos pages comme des erreurs".

Comment régler ce problème ?

En se débarrassant de ce pseudo-expert.
 
WRInaute discret
Je vais avoir du mal à répondre cela à mon client sachant que ce pseudo expert est un français installé aux EU et intervenant dans une université américaine ^^

Quel code faut il que je rajoute pour que cela affecte aussi les urls avec des sous dossiers ?
 
WRInaute accro
+1 @rick38

27sdpc.jpg
 
WRInaute discret
Mais je veux bien que ce soit une connerie, mais je me vois mal dire ça à mon client qui a payé qqun sensé être de confiance ^^ Jamais je n'aurai pensé devoir faire une modif comme celle là mais là vraiment pas le choix...
 
WRInaute discret
Bref j'aurai besoin de qqun qui puisse me dire ce que je dois modifier dans la partie du code ci dessous pour que le sous dossiers soient aussi pris en compte

Code:
RewriteCond %{ENV:HASCAPS} TRUE
RewriteRule ^/?(.*) /$1 [R=301,L]
 
WRInaute accro
Pourquoi ne pas le gérer directement en php avec getenv('REQUEST_URI'); ?

Genre (à l'arrache :) )
Code:
$origine = getenv('REQUEST_URI');
$urldefinitive = "/ton-sous-dossier/tout-en-minuscule.html"; <= généré en php :-)
if ($origine != $urldefinitive){
header("Location: $urldefinitive", true, 301); 
exit;
}
 
WRInaute discret
Tu as quand même conscience que ça n'influe pas l'algorithme de Google, que tu aies des majuscules et/ou minuscules dans tes URL ?
 
WRInaute passionné
Il n'y a pas de norme sauf pour dire que HTTPS://WWW.WEBRANKINFO.COM doit fonctionner en passant en lower case (géré par le browser j'imagine), mais pour le reste de l'URL si le serveur est Linux c'est sensible à la casse et sous IIS les deux fonctionnent (si on ne change pas la config par défaut).

Pourquoi ne pas le gérer directement en php avec getenv('REQUEST_URI'); ?

Genre (à l'arrache :) )
Code:
$origine = getenv('REQUEST_URI');
$urldefinitive = "/ton-sous-dossier/tout-en-minuscule.html"; <= généré en php :-)
if ($origine != $urldefinitive){
header("Location: $urldefinitive", true, 301);
exit;
}

Ou de manière plus générique :

Code:
if ($_SERVER['REQUEST_URI'] != strtolower($_SERVER['REQUEST_URI']))
{
    header('Location: ' . strtolower($_SERVER['REQUEST_URI']), true, 301);
    exit();
}

Pour la solution Apache / .htaccess, ça se trouve sur le net mais ça m'a l'air plus compliqué...
 
Dernière édition:
WRInaute impliqué
Although schemes are case-
insensitive, the canonical form is lowercase and documents that
specify schemes must do so with lowercase letters. An implementation
should accept uppercase letters as equivalent to lowercase in scheme
names (e.g., allow "HTTP" as well as "http") for the sake of
robustness but should only produce lowercase scheme names for
consistency.
 
WRInaute impliqué
bon mais sinon comme ca a l'air d'être du linux, il faut regarder dans la doc apache
Un gros linuxien te dirait que c'est dans la doc et que les doc c'est fait pour être lues.

Donc peut-être du côté de rewriteMap : chaque fois qu'on veut faire un truc un peu tricky dans les redirections sous apache c'est dans rewriteMap

Allez, encore un peu de copier coller :

Lorsque le type-map int est spécifié, la source est une des fonctions RewriteMap internes disponibles. Les développeurs de modules peuvent fournir des fonctions internes supplémentaires en les enregistrant via l'API ap_register_rewrite_mapfunc. Les fonctions fournies par défaut sont :

  • toupper:
    Met tous les caractères de la clé en majuscules.
  • tolower:
    Met tous les caractères de la clé en minuscules.
  • escape:
    Protège les caractères spéciaux de la clé en les transformant en leur code hexadécimal.
  • unescape:
    Retraduit les codes hexadécimaux de la clé en caractères spéciaux.
Pour utiliser une de ces fonctions, créez une RewriteMap faisant référence à cette fonction int, et utilisez-la dans votre règle RewriteRule :

Redirige un URI vers son équivalent en minuscules

RewriteMap lc int:tolower
RewriteRule "(.*)" "${lc:$1}" [R]
Notez que cet exemple n'est fourni qu'à titre d'illustration, et ne constitue en aucun cas une recommandation. Si vous voulez rendre des URLs insensibles à la casse, vous devez plutôt vous tourner vers mod_speling.



Chez Krosoft, c'est très différent. Si tu fais du .net MVC jusqu'à version 5, alors tu va t"en sortir avec le module rewrite-rule de IIS qui te permet de tout faire, directement dans IIS, mais c'est un peu long à écrire dans un forum de référencement.
Si tu fais du net core, alors c'est encore 100 fois plus puissant, mais c'est dans le code du site et 1000 fois plus compliqué si tu fais du web et n'a jamais touché à des machins tels que la DI (prononcer di aillle)
 
Discussions similaires
Haut