Comment implémenter la réécriture d'URL dans mon fichier .htaccess?

17

Je voudrais faire une réécriture d'URL (Pourquoi? Voir cette question .) Afin qu'au lieu que les utilisateurs voient des adresses comme

labouseur.com/course-compilers.html 

ils peuvent plutôt voir et utiliser simplement

labouseur.com/course-compilers

(Encore mieux, je devrais peut-être restructurer cela pour que ce soit des cours / compilateurs.)

J'utilise un service d'hébergement partagé basé sur Linux pour mon site Web, donc je n'ai pas le contrôle administratif du serveur, mais j'ai le contrôle sur .htaccess. Les références que j'ai lues en ligne me semblaient peu claires, je cherche donc ici un peu de clarté et de conseils.

Alan
la source
Notez que ce n'est pas quelque chose que vous faites uniquement dans la configuration du serveur (.htaccess). La première étape importante consiste à modifier réellement les URL dans votre application, sinon vous vous retrouverez avec beaucoup de redirections inutiles (ou du contenu en double).
MrWhite

Réponses:

13

Vous pouvez réellement supprimer .html des fichiers sur votre serveur et définir les paramètres dans htaccess afin qu'ils soient servis sous forme de fichiers html, mais ce n'est probablement pas ce que vous recherchez.

Faites ceci:

RewriteEngine on
# Check this condition to ensure that it's not a directory.
RewriteCond %{REQUEST_FILENAME} !-d
# Check this condition to ensure that there's a file there
RewriteCond %{REQUEST_FILENAME}\.html -f
# Replace html with your file extension, eg: php, htm, asp
RewriteRule ^(.*)$ $1.html
Rizwan Kassim
la source
Il y a plus de complexité ici, surtout si vous vous inquiétez des problèmes de contenu en double. Avec la règle ci-dessus, vos pages seront toujours accessibles à partir des anciennes URL.
JasonBirch
3

Tout d'abord, assurez-vous qu'apache possède le module et qu'il est autorisé dans les fichiers .htacces, puis ajoutez:

RewriteEngine on

# Rewrite rules
RewriteRule ^/myoldsubfolder/(.*) /newfolder/$1 

Votre exemple nécessiterait

RewriteCond %{REQUEST_URI} !-d
RewriteCond %{REQUEST_URI}\.html -f
RewriteRule ^/(([a-zA-Z0-9_]+)/?)$ /$1.html

Pour une structure de répertoire à un niveau et

RewriteRule ^/(([a-zA-Z0-9_]+)/?)+$ /$1.html

Pour une structure à plusieurs niveaux.

Mais attention

Si vous avez la structure

/site/.htaccess
/site/subfolder/.htaccess
/site/subfolder/cats/.htaccess

Les règles de réécriture dans les .htaccessfichiers enfants seront relatives à leur dossier parent et vous pouvez vous retrouver dans des situations de boucle de réécriture désordonnées . Assurez-vous que vous utilisez RewriteCondpour les empêcher de se produire si vous le pouvez!

Aiden Bell
la source
Cela vous dérange d'aller plus en détail sur ce dernier point (en utilisant RewriteCond pour arrêter les boucles)?
Travis Northcutt du
2

En plus des réponses ci-dessus, on peut utiliser

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^([\w-]+)$ $1.html [L]

([\w-]+) Permet les lettres, les chiffres avec un tiret (-).

(.*) réécrira chaque demande indépendamment, ce qui peut impuir les autres règles suivantes provoquant une erreur de serveur interne lors de l'accès.

Abhishek Gurjar
la source
Votre RewriteRule modèle est une amélioration par rapport à la réponse acceptée pour l'exemple spécifique donné dans la question, cependant, il ne correspondra pas au cas plus général lorsqu'il y a plus d'un segment de chemin, par exemple. /path/to/course-compilers. Incluez le Ldrapeau pour réduire l'impact sur les règles suivantes. Bien que le (.*)modèle soit inutilement général, il est peu probable qu'il cause de graves problèmes, en raison de la condition qui vérifie que le fichier existe.
MrWhite
1

Vous n'avez pas besoin d'utiliser un fichier .htaccess pour accomplir cela. Structurez simplement vos fichiers en répertoires, et au lieu d'utiliser "labouseur.com/course-compilers.html", nommez simplement le fichier index.html et placez-le dans un répertoire appelé "course-compilers". Ensuite, lorsque vous pointez sur ce répertoire, l'index est servi par défaut mais ne sera pas affiché dans l'URL. Vous pouvez donc simplement écrire vos liens sous "labourseur.com/course-compilers" et tout ira bien.

Aucun .htaccess requis.

Joel Glovier
la source