Site original : le hollandais volant
J’avais déjà fait un article sur ça il y a longtemps, mais là aussi il semble qu’elle ne soit plus au goût du jour.
Après moult tests et quelques surprises, je mets ici quelques snippets de code, pour mémo, surtout pour moi.
Notes :
example.com
, il faut remplacer ça par votre site à vous ;.htaccess
.Notes 2 :
Selon votre fichier et les règles qui s’y trouvent déjà, il peut être nécessaire d’y ajouter (une fois) les instructions suivantes :
RewriteEngine on
RewriteBase /
Je ne les fais pas figurer partout ci-dessous.
Les navigateurs le font tout seuls parfois, mais il vaut mieux l’ajouter :
## Force HTTPS
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301]
Certains préfèrent le conserver, d’autres non. Dans tous les cas, il est préférable d’avoir un choix et de forcer la redirection de l’une des URL vers l’autre. C’est plus propre et c’est aussi mieux pour le référencement d’avoir une seule URL pour chaque ressource :
## Removes www.
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ https://%1%{REQUEST_URI} [R=301]
J’ai mis du temps à trouver un code qui fonctionne quelle que soit la position des doubles-slashs. Généralement les forums en proposaient plusieurs selon que le slash soit au début, à la fin ou au milieu de l’URL.
## Removes multiple consecutive slashes anywhere in URL
RewriteCond %{THE_REQUEST} \s[^?]*//
RewriteRule ^.*$ /$0 [R=301,NE]
Maintenant, les urls suivantes :
exemple.com///dossier/fichier
;exemple.com/dossier///fichier
;exemple.com/dossier///
;exemple.com////dossier///fichier
Sont toutes réécrites en :
exemple.com/dossier/fichier
## Rewrite ^*.php/*$ to *.php$ (removes anything after a "*.php/")
RewriteCond %{REQUEST_URI} ^(.*)\.php/(.*)$
RewriteRule . %1.php [R=301]
Celui-là est plus compliqué.
Quand on appelle un fichier fichier.php
, on en exécute le contenu. Si l’on l’appelle avec un paramètre fichier.php?parametre
, c’est toujours le même fichier qui est exécuté, mais maintenant l’exécution tient compte de la valeur du paramètre.
Dans le cas suivant par contre, il y a possibilité de problèmes : fichier.php/
.
Le fichier est appelé (et donc exécuté), mais il est traité comme un dossier (car il est suivi d’un slash et non d’un point d’interrogation), et avec lui la notion de profondeur de l’arborescence, etc.
C’est un problème assez sévère et je préfère l’éviter.
J’y vais donc assez lourdement : quand je vois un fichier .php qui est directement suivi d’un slash, on vire tout ce qui suit le slash, incluant ce dernier.
Les urls suivantes :
exemple.com/fichier.php
;exemple.com/fichier.php/
;exemple.com/fichier.php/blabla/autreblabla
;Sont toutes réécrites en :
exemple.com/fichier.php
Notez que ça ne visera que le script exécuté. Rien n’empêche en effet d’avoir la chaîne « .php » suivi d’un slash dans un paramètre d’un autre fichier php (celui exécuté).
Cette URL ne sera pas modifiée, par exemple : exemple.com/fichier.php?parametre=fichier.php/bla/bla
## Rewrites "/index.php" to "/"
RewriteCond %{REQUEST_URI} ^(.*)/index\.php$ [NC]
RewriteRule . %1 [R=301,L]
Quand on affiche un dossier sur un site, comme example.com/folder/
, le « index.php » ou « index.html » qu’il contient est implicitement affiché. C’est la page par défaut. Le demander de façon explicite est donc généralement inutile.
Afin d’éviter d’avoir des URL redondantes, je préfère ne conserver que les URL sans le « index.php ». Les éventuels paramètres, eux, sont maintenus.
Avec tout ça, toutes les URL suivantes :
http://lehollandaisvolant.net/tuto/
(https)http://www.lehollandaisvolant.net/tuto/
(https ; www)https://lehollandaisvolant.net/tuto/
(url OK)https://lehollandaisvolant.net//tuto/
(double slash après le TLD)https://lehollandaisvolant.net/tuto///
(double slash à la fin)https://lehollandaisvolant.net/tuto/index.php
(index.php)https://lehollandaisvolant.net/tuto/index.php/
(index.php + slash)https://lehollandaisvolant.net/tuto/index.php/folder/
(index.php + slash + faux-dossier)http://www.lehollandaisvolant.net//////tuto/index.php//dossier/sousdossier/foo/
(tout ce qui précède)Renvoient toutes sur :
https://lehollandaisvolant.net/tuto/
On peut mettre un fichier .htaccess dans chaque dossier et leurs sous-dossiers si l’on veut, et les directives seront appliquées à tous les fichiers inclus dans le dossier, y compris leurs sous-dossiers.
Par contre, mettre un RewriteEngine on
dans un des sous-dossiers pourra avoir pour effet d’annuler les directives des fichiers situées dans les dossiers parents. C’était le cas chez moi récement, même si je n’ai pas souvenir d’un tel comportement lors de la mise en place de ces fichiers.
Il est possible que ça vienne de la configuration du serveur.