Une collection utile de fragments de configuration de fichier
.htaccess
, le tout regroupé dans un seul endroit.
Avertissement : Bien que l’extrait mis dans un fichier
.htaccess
est la plupart du temps suffisant, il ya des cas où
certaines modifications pourraient être nécessaires. À utiliser à vos
propres risques.
IMPORTANT : Apache 2.4 a introduit quelques changements de rupture, notamment dans la configuration de contrôle d’accès. Pour plus d’information, consultez le document de mise à niveau ainsi que cette issue.
Ce que nous faisons ici est principalement la collection d’extraits pratiques en provenance d’un peu partout sur le web, par exemple, une bonne partie provient du dépôt Apache Server Configs. Bien qu’ayant essayé de créditer la bonne personne, des éléments peuvent être manquants. Si vous pensez que quelque chose ici provient de votre travail et que vous devriez en être crédité, faites le moi savoir, ou faites une PR.
Remarque: On suppose avoir le module mod_rewrite
installé et
activé.
RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301,NC]
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Cela fonctionne pour tous les domaines. Source
C’est
toujours
en cours
de
débat selon s’il faut prévilégier la
forme avec ou sans www
, donc si vous êtes un fan de domaine
“à nu”, ceci est pour vous :
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.
RewriteCond %{HTTPS}s ^on(s)|off
RewriteCond http%1://%{HTTP_HOST} ^(https?://)(www\.)?(.+)$
RewriteRule ^ %1%3%{REQUEST_URI} [R=301,L]
RewriteEngine on
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
Ceci est utile si vous avez un proxy devant votre serveur faisant une termination TLS :
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
RewriteCond %{REQUEST_URI} /+[^\.]+$
RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [R=301,L]
Redirect 301 /anciennepage.html http://www.votresite.com/nouvellepage.html
Redirect 301 /anciennepage2.html http://www.votresite.com/dossier/
RewriteEngine On
RewriteRule ^source-directory/(.*) target-directory/$1
FallbackResource /index.fcgi
Cet exemple a un fichier index.fcgi
dans un répertoire, et
toutes les requêtes à l’intérieur de ce dossier qui ne peuvent résoudre le
fichier/dossier demandé seront renvoyées vers le script
index.fcgi
. Ceci est utile si vous souhaitez que
baz.foo/une/route/sympa
soit manipulé par
baz.foo/index.fcgi
(qui prend également en charge les
demandes vers baz.foo
) tout en maintenant
baz.foo/css/style.css
ou autre fonctionnels. Accédez au
chemin d’origine de la variable d’environnement PATH_INFO
,
comme exposé à votre environnement de scriptage.
RewriteEngine On
RewriteRule ^$ index.fcgi/ [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.fcgi/$1 [QSA,L]
Ceci est une version moins efficace de la directive
FallbackResource
(car l’utilisation de
mod_rewrite
est plus complexe que de maintenir la directive
FallbackResource
), mais offre d’avantage de flexibilité.
Redirect 301 / http://nouveausite.com/
Ceci laisse les liens intacts. Ainsi
anciensite.com/lien/super/genial.html
deviendra
nouveausite.com/lien/super/genial.html
. Cela est très
pratique lorsque vous souhaitez déplacer un site vers un nouveau domaine.
Ce snippet vous permet d’utiliser des “URLs propres” –celles sans
extension–, par exemple : example.com/users
à la place de
example.com/users.php
.
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^([^.]+)$ $1.php [NC,L]
## Apache 2.2
Deny from all
## Apache 2.4
# Require all denied
Mais… ceci vous bloquera vous également ! Si ce n’est pas ce que vous souhaitez, la partie suivante est sûrement faite pour vous !
## Apache 2.2
Order deny,allow
Deny from all
Allow from xxx.xxx.xxx.xxx
## Apache 2.4
# Require all denied
# Require ip xxx.xxx.xxx.xxx
En remplaçant xxx.xxx.xxx.xxx
par votre adresse IP, vous
n’autoriserez l’accès à votre site que par vous. Si vous remplacez les 3
dernièrs numéros par 0/12
par exemple, ceci spécifiera un
intervalle d’adresses IPs à l’intérieur d’un même réseau, vous évitant
ainsi de lister toutes les IPs autorisées individuellement.
Bien sûr, il y a la version inverse :
## Apache 2.2
Order deny,allow
Deny from xxx.xxx.xxx.xxx
Deny from xxx.xxx.xxx.xxy
## Apache 2.4
# Require all granted
# Require not ip xxx.xxx.xxx.xxx
# Require not ip xxx.xxx.xxx.xxy
Les fichiers et dossiers cachés (ceux dont les noms commencent par un
point .
) devraient être pour la majorité d’entre eux
sécurisés. On ne devrait par exemple pas avoir accès aux éléments suivants
: .htaccess
, .htpasswd
, .git
,
.hg
…
RewriteCond %{SCRIPT_FILENAME} -d [OR]
RewriteCond %{SCRIPT_FILENAME} -f
RewriteRule "(^|/)\." - [F]
Une autre solution serait de lever une erreur 404 Not Found
,
ne donnant aucun indice à l’attaquant quant à l’existance de la ressource
:
RedirectMatch 404 /\..*$
Ces fichiers peuvent être laissés par certains éditeurs de texte/html (comme Vi/Vim) et poser un grand danger en terme de sécurité, quand quelqu’un y a accès.
<FilesMatch "(\.(bak|config|dist|fla|inc|ini|log|psd|sh|sql|swp)|~)$">
## Apache 2.2
Order allow,deny
Deny from all
Satisfy All
## Apache 2.4
# Require all denied
</FilesMatch>
Options All -Indexes
RewriteEngine on
# Enlever la ligne ci-dessous si vous souhaitez bloquer le referrer vide
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(.+\.)?votredomaine.com [NC]
RewriteRule \.(jpg|jpeg|png|gif|bmp)$ - [NC,F,L]
# Si vous souhaitez afficher une bannière "Bloquée" d'url 'blocked.png' au lieu
# du hotlink de l'image, replacez la règle ci-dessus par celle-ci :
# RewriteRule \.(jpg|jpeg|png|gif|bmp) http://votredomaine.com/blocked.png [R,L]
Parfois vous souhaitez désactiver le hotlink d’images seulement pour quelques domaines spécifiques. L’extrait suivant devrait vous aider :
RewriteEngine on
RewriteCond %{HTTP_REFERER} ^http(s)?://(.+\.)?mauvaissite\.com [NC,OR]
RewriteCond %{HTTP_REFERER} ^http(s)?://(.+\.)?mauvaissite2\.com [NC,OR]
RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]
# Si vous souhaitez afficher une bannière "Bloquée" d'url 'blocked.png' au lieu
# du hotlink de l'image, replacez la règle ci-dessus par celle-ci :
# RewriteRule \.(jpg|jpeg|png|gif|bmp) http://votredomaine.com/blocked.png [R,L]
D’abord, vous aurez besoin de créer un fichier
.htpasswd
quelque part sur le système, avec l’aide de la
commande suivante :
Ensuite, vous pouvez utiliser ceci pour activer l’authentification :
AuthType Basic
AuthName "One does not simply"
AuthUserFile /home/fellowship/.htpasswd
Require valid-user
AuthName "One still does not simply"
AuthType Basic
AuthUserFile /home/fellowship/.htpasswd
<Files "one-ring.o">
Require valid-user
</Files>
<FilesMatch ^((one|two|three)-rings?\.o)$>
Require valid-user
</FilesMatch>
<IfModule mod_deflate.c>
# Force compression for mangled headers.
# https://developer.yahoo.com/blogs/ydn/pushing-beyond-gzipping-25601.html
<IfModule mod_setenvif.c>
<IfModule mod_headers.c>
SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
</IfModule>
</IfModule>
# Compresse toutes les sorties ayant un de ces types MIME
# (pour Apache < 2.3.7, vous n'avez pas besoin d'activer `mod_filter`
# et vous pouvez supprimer le `<IfModule mod_filter.c>` et `</IfModule>`
# comme `AddOutputFilterByType` sera toujours dans les directives du noyau).
<IfModule mod_filter.c>
AddOutputFilterByType DEFLATE application/atom+xml \
application/javascript \
application/json \
application/rss+xml \
application/vnd.ms-fontobject \
application/x-font-ttf \
application/x-web-app-manifest+json \
application/xhtml+xml \
application/xml \
font/opentype \
image/svg+xml \
image/x-icon \
text/css \
text/html \
text/plain \
text/x-component \
text/xml
</IfModule>
</IfModule>
L’en-tête Expires indique au navigateur s’il doit effectuer une requête au serveur pour récupérer un fichier spécifique ou bien se contenter du cache. On peut conseiller pour les contenus statiques un en-tête d’expiration loin dans le futur.
Si vous n’utilisez pas la méthode du nom de fichier modifié par un système de contrôle de version, vous devriez diminuer le temps de cache des ressources telles que les fichiers CSS ou JS vers quelque chose proche de la semaine.
<IfModule mod_expires.c>
ExpiresActive on
ExpiresDefault "access plus 1 month"
# CSS
ExpiresByType text/css "access plus 1 year"
# Data interchange
ExpiresByType application/json "access plus 0 seconds"
ExpiresByType application/xml "access plus 0 seconds"
ExpiresByType text/xml "access plus 0 seconds"
# Favicon (cannot be renamed!)
ExpiresByType image/x-icon "access plus 1 week"
# HTML components (HTCs)
ExpiresByType text/x-component "access plus 1 month"
# HTML
ExpiresByType text/html "access plus 0 seconds"
# JavaScript
ExpiresByType application/javascript "access plus 1 year"
# Manifest files
ExpiresByType application/x-web-app-manifest+json "access plus 0 seconds"
ExpiresByType text/cache-manifest "access plus 0 seconds"
# Media
ExpiresByType audio/ogg "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType video/mp4 "access plus 1 month"
ExpiresByType video/ogg "access plus 1 month"
ExpiresByType video/webm "access plus 1 month"
# Web feeds
ExpiresByType application/atom+xml "access plus 1 hour"
ExpiresByType application/rss+xml "access plus 1 hour"
# Web fonts
ExpiresByType application/font-woff2 "access plus 1 month"
ExpiresByType application/font-woff "access plus 1 month"
ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
ExpiresByType application/x-font-ttf "access plus 1 month"
ExpiresByType font/opentype "access plus 1 month"
ExpiresByType image/svg+xml "access plus 1 month"
</IfModule>
En retirant l’en-tête “eTag”, vous empêchez le cache et les navigateurs de pouvoir valider les fichiers, ils sont donc forcés de se baser sur le Cache-Control (contrôle de cache) et les Expires header (en-tête d’expiration).
<IfModule mod_headers.c>
Header unset ETag
</IfModule>
FileETag None
php_value <key> <val>
# Par exemple :
php_value upload_max_filesize 50M
php_value max_execution_time 240
ErrorDocument 500 "Houston, on a un problème."
ErrorDocument 401 http://error.votredomaine.com/mordor.html
ErrorDocument 404 /errors/halflife3.html
Parfois, vous souhaitez forcer le navigateur à télécharger certaines ressources au lieu de les afficher. Le snippet suivant vous sera utile :
<Files *.md>
ForceType application/octet-stream
Header set Content-Disposition attachment
</Files>
Si vous souhaitez l’action inverse :
Parfois, vous souhaitez forcer le navigateur à afficher certains contenus au lieu de les télécharger. Le snippet suivant devrait vous aider :
<FilesMatch "\.(tex|log|aux)$">
Header set Content-Type text/plain
</FilesMatch>
Les polices desservies par un serveur CDN peuvent ne pas fonctionner sur Firefox ou IE à cause de CORS. Le snippet suivant de alrra devrait corriger cela :
<IfModule mod_headers.c>
<FilesMatch "\.(eot|otf|ttc|ttf|woff|woff2)$">
Header set Access-Control-Allow-Origin "*"
</FilesMatch>
</IfModule>
Votre contenu textuel devrait toujours être encodé en UTF-8, non ?
# Utiliser l'encodage UTF-8 pour tout ce qui est servi en text/plain ou text/html
AddDefaultCharset utf-8
# Forcer l'UTF-8 pour certains formats de fichier
AddCharset utf-8 .atom .css .js .json .rss .vtt .xml
Si vous êtes sur un serveur mutualisé, il y a des chances pour qu’il y ait plus d’une version de PHP installée, et parfois, vous avez besoin d’une version spécifique pour votre site web.
Par exemple Laravel nécessite PHP >= 5.4. Le snippet suivant devrait passer d’une version à l’autre de PHP pour vous :
AddHandler application/x-httpd-php55 .php
# Autrement, vous pouvez utiliser AddType
AddType application/x-httpd-php55 .php
Le mode de compatibilité dans IE peut affecter l’affichage de certains sites web. L’extrait suivant devrait forcer IE à utiliser le moteur d’interprétation Edge et ainsi désactiver le mode de compatibilité.
<IfModule mod_headers.c>
BrowserMatch MSIE is-msie
Header set X-UA-Compatible IE=edge env=is-msie
</IfModule>
Si
WebP images
est supporté et que l’image avec l’extension .webp
a le même
nom qu’une image jpg/png alors l’image Webp sera servie à la place.
RewriteEngine On
RewriteCond %{HTTP_ACCEPT} image/webp
RewriteCond %{DOCUMENT_ROOT}/$1.webp -f
RewriteRule (.+)\.(jpe?g|png)$ $1.webp [T=image/webp,E=accept:1]