cheatsheet • serveur Apache
par alsacreations.fr
Cheatsheet .htaccess
Bases & drapeaux
RewriteEngine OnActive le moteur de réécriture mod_rewrite. Obligatoire en tête de fichier avant toute directive RewriteCond ou RewriteRule.
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / </IfModule>La protection <IfModule> évite une erreur 500 si le module n'est pas chargé. RewriteBase fixe le chemin de référence des règles relatives.
Drapeaux (flags) courants
[L] dernière règle appliquée · [R=301] redirection permanente · [NC] insensible à la casse · [QSA] conserve la chaîne de requête · [NE] n'encode pas les caractères spéciaux · [OR] condition alternative.
Options -IndexesDésactive le listage automatique du contenu d'un dossier dépourvu de page d'accueil. À poser par réflexe sur tout site en production.
Ordre de lecture : Les règles sont évaluées de haut en bas et le fichier est relu à chaque requête : aucun redémarrage d'Apache n'est nécessaire, mais un fichier .htaccess trop long pénalise les performances.
Redirections
Redirect/RedirectPermanentRedirect (ou RedirectTemp) produit une redirection temporaire (code 302), RedirectPermanent une redirection définitive (code 301), celle qui transmet le référencement.
RedirectPermanent /home /?lang=enRedirige une adresse vers une autre sur le même site. Ces directives n'acceptent pas d'expression régulière : pour cela, utiliser RedirectMatch ou RewriteRule avec [R=301].
RedirectPermanent /formations https://formations.example.org/Redirige un chemin local vers un site externe.
RedirectMatch "^/ecrire$" /ecrire/Ajoute une barre oblique finale. L'expression régulière est indispensable ici : un simple /ecrire provoquerait une boucle de redirection infinie.
RedirectMatch "^\/notre-societe\/$" "/notre-societe"Supprime à l'inverse une barre oblique finale.
RedirectMatch "^\/spip\/(.*)" "/autre/chemin/$1"Redirige toute une arborescence en conservant la fin de l'adresse, capturée par (.*) et restituée par $1.
HTTPS & domaine canonique
RewriteEngine On RewriteCond %{HTTPS} !=on RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]Redirige tout le trafic HTTP vers HTTPS en préservant l'hôte et le chemin demandés.
RewriteEngine On RewriteCond %{HTTP_HOST} ^alsacreations.fr [OR] RewriteCond %{HTTP_HOST} ^www.alsacreations.fr RewriteRule ^(.*)$ https://www.alsacreations.com/$1 [R=301,NC,L]Redirige un domaine, ou tout un ensemble de domaines grâce au drapeau [OR], vers un domaine unique.
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] RewriteRule ^(.*)$ https://%1/$1 [L,R=301]Supprime le préfixe www. pour imposer une adresse canonique unique. %1 reprend la capture de la RewriteCond, $1 celle de la RewriteRule.
Header always set Strict-Transport-Security "max-age=31536000"Indique aux navigateurs de ne plus jamais tenter d'accéder au site en clair. À n'activer qu'une fois le HTTPS pleinement opérationnel.
Réécriture
RewriteRule "^spip.php$" /home/www/spip/spip.php [L]Réécrit une adresse vers un chemin réel, sans changer l'adresse affichée. La chaîne de requête qui suit ? est ignorée par la règle : spip.php?page=truc correspond aussi.
RewriteRule ^img/(.*)$ /home/www/autre/chemin/img/$1 [L]Réécrit tout un dossier, ou tout ce qui commence par un motif donné, en conservant la suite du chemin.
RewriteRule ^notre-societe$ /autre/spip/notre-societe [L] RewriteRule ^notre-societe$ /autre/spip/notre-societe [L,R=301]Une adresse précise : réécriture interne silencieuse sur la première ligne, redirection permanente visible par le navigateur sur la seconde.
RewriteCond %{REQUEST_URI} !^/spip\.php.* RewriteRule ^(.*)$ /home/www/wordpress/public/$1 [L]Tout réécrire sauf une exception : le point d'exclamation inverse la condition.
Blocage & accès
RedirectMatch 404 .git RedirectMatch 404 /spip/Rend une ressource inaccessible en répondant « non trouvé ». Préférable à un 403, qui confirmerait l'existence de la ressource.
<FilesMatch "\.(env|ini|log|sql|bak)$"> Require all denied </FilesMatch>Interdit l'accès direct aux fichiers sensibles par leur extension : configuration, journaux, sauvegardes de base de données.
Require all denied Require ip 192.0.2.14Réserve l'accès à une ou plusieurs adresses IP. Syntaxe Apache 2.4, qui remplace les anciens Order / Allow / Deny.
AuthType Basic AuthName "Accès restreint" AuthUserFile /chemin/absolu/.htpasswd Require valid-userProtège un dossier par identifiant et mot de passe. Le fichier .htpasswd se génère avec la commande htpasswd -c .htpasswd utilisateur.
Header set X-Robots-Tag "noindex, noarchive"Empêche l'indexation par les moteurs de recherche au niveau de l'en-tête HTTP, y compris pour des fichiers non HTML.
Erreurs & performances
ErrorDocument 404 /404.html ErrorDocument 403 /403.htmlAssocie une page personnalisée à un code d'erreur. Le chemin part de la racine du site, pas du système de fichiers.
<IfModule mod_deflate.c> AddOutputFilterByType DEFLATE text/html text/css AddOutputFilterByType DEFLATE application/javascript image/svg+xml </IfModule>Active la compression à la volée des ressources textuelles. Inutile sur les images matricielles ou les archives, déjà compressées.
<IfModule mod_expires.c> ExpiresActive On ExpiresByType image/webp "access plus 1 year" ExpiresByType text/css "access plus 1 year" </IfModule>Fixe la durée de mise en cache par les navigateurs. Une année ne se justifie que pour des fichiers dont le nom change à chaque version.
AddDefaultCharset UTF-8Impose l'encodage UTF-8 par défaut, ce qui évite les caractères accentués mal restitués.
Vérifier avant de mettre en ligne : Une redirection se teste avec curl -I https://example.org/chemin. Attention aux redirections 301 mises en cache par le navigateur : utiliser une fenêtre privée pendant les tests.