Définition et généralités

Un fichier htaccess est placé à la racine d’un site web, il permet de “communiquer” avec le serveur, et peut être utilisé principalement pour les aspects suivants:

  • Protéger l’accès à une page / un dossier ou répertoire / un site
  • Gérer la réécriture des URL
  • Définir des éventuelles redirections
  • Définir les pages d’erreurs personnalisées
  • Limiter l’accès à certains utilisateurs
  • Interdire le listing des répertoires
  • Donner des consignes au navigateurs (mise en cache, compression, etc.)

Il est donc très important (indispensable) de configurer correctement son fichier .htaccess, ce que de nombreuses personnes ne font pas.

Préparation

Dans un premier temps, il faut faire une copie de ce fichier, et le conserver quelque part, en toute sécurité. En cas de problème, vous pourrez restaurer cette version du fichier
Il est recommandé de réaliser une par une les étapes suivantes, et de tester à chaque fois, pour voir si cela fonctionne. De cette façon, si vous avez mal écris une ligne de code, il sera plus facile de détecter l’erreur.

Protection du fichier .htaccess

# protect the htaccess file
<files .htaccess>
order allow,deny
deny from all
</files>

Protéger les répertoires

Certains dossiers ne contiennent pas d’index, dès lors, il se peut que soit affichée la liste des fichiers contenus dans ce dossier, ce qui peut être une porte d’entrée, une faille potentielle pour les hackers. Pour éviter cette éventualité, il faut donc protéger les répertoires.

# protection de la lecture des répertoires
Options -Indexes

Mise en cache des éléments

Cette étape permet de mettre en cache les différents types d’éléments et de contenus du site, et de définir la durée (unité: secondes) de cette mise en cache

# BEGIN Cache-Control Headers
<ifmodule mod_headers.c>
 <filesmatch "\\.(ico|jpe?g|png|gif|swf|gz|ttf)$">
 Header set Cache-Control "max-age=2592000, public"
 </filesmatch>
 <filesmatch "\\.(css)$">
 Header set Cache-Control "max-age=2592000, public"
 </filesmatch>
 <filesmatch "\\.(js)$">
 Header set Cache-Control "max-age=2592000, private"
 </filesmatch>
<filesmatch "\\.(html|htm)$">
Header set Cache-Control "max-age=7200, public"
</filesmatch>
# Disable caching for scripts and other dynamic files
<filesmatch "\.(pl|php|cgi|spl|scgi|fcgi)$">
Header unset Cache-Control
</filesmatch>
</ifmodule>
# END Cache-Control Headers

Compression de fichiers

La compression de certains fichiers permet de réduire significativement leur taille, et ainsi, rendre leur téléchargement drastiquement plus rapide, améliorant ainsi la vitesse de chargement de votre site. Quelques lignes suffisent donc à gagner de précieuses secondes !

Attention! Il faut choisir une des deux options uniquement.

Option 1: MOD DEFLATE

# MOD_DEFLATE COMPRESSION
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/html text/css text/plain text/xml application/x-javascript application/x-httpd-php
#Pour les navigateurs incompatibles
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
#ne pas mettre en cache si ces fichiers le sont déjà
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip
#les proxies doivent donner le bon contenu
Header append Vary User-Agent env=!dont-vary

Option 2: Compression en Gzip

Le “Mod_Gzip” est un peu plus performant (fonctionne avec apache 1.x – pas compatible en mod_deflate)

RewriteEngine on
#Check to see if browser can accept gzip files. If so and we have it – serve it!
ReWriteCond %{HTTP:accept-encoding} gzip
RewriteCond %{HTTP_USER_AGENT} !Safari
#make sure there’s no trailing .gz on the url
ReWriteCond %{REQUEST_FILENAME} !^.+.gz$
#check to see if a .gz version of the file exists.
RewriteCond %{REQUEST_FILENAME}.gz -f
#All conditions met so add .gz to URL filename (invisibly)
RewriteRule ^(.+) $1.gz [QSA,L]
<ifmodule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_keep_workfiles No
mod_gzip_can_negotiate Yes
mod_gzip_add_header_count Yes
mod_gzip_send_vary Yes
mod_gzip_command_version ‘/mod_gzip_status’
mod_gzip_min_http 1000
mod_gzip_minimum_file_size 300
mod_gzip_maximum_file_size 512000
mod_gzip_maximum_inmem_size 60000
mod_gzip_handle_methods GET POST
mod_gzip_temp_dir /tmp
mod_gzip_item_include file .html$
mod_gzip_item_include file .php$
mod_gzip_item_include file .pl$
mod_gzip_item_include file .rb$
mod_gzip_item_include file .py$
mod_gzip_item_include file .cgi$
mod_gzip_item_include file .css$
mod_gzip_item_include file .js$
mod_gzip_item_include mime ^application/javascript$
mod_gzip_item_include mime ^application/x-javascript$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^httpd/unix-directory$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include handler ^server-status$
mod_gzip_item_include handler ^server-info$
mod_gzip_item_include handler ^application/x-httpd-php
mod_gzip_item_exclude mime ^image/.*
</ifmodule>

Expires headers

Les “Expires headers” indiquent au navigateur si ils doivent télécharger des fichiers sur le serveur ou si ils doivent les prendre dans la mémorie cache du navigateur. le but ici est donc de réduire la charge de téléchargements depuis le serveur et donc de réduire le nombre de requêtes HTTP pour le serveur; ce qui signifie concrètement diminuer le temps de chargement de votre site.

# BEGIN Expire headers
<ifmodule mod_expires.c>
 ExpiresActive On
 ExpiresDefault "access plus 7200 seconds"
 ExpiresByType image/jpg "access plus 2592000 seconds"
 ExpiresByType image/jpeg "access plus 2592000 seconds"
 ExpiresByType image/png "access plus 2592000 seconds"
 ExpiresByType image/gif "access plus 2592000 seconds"
 AddType image/x-icon .ico
 ExpiresByType image/ico "access plus 2592000 seconds"
 ExpiresByType image/icon "access plus 2592000 seconds"
 ExpiresByType image/x-icon "access plus 2592000 seconds"
 ExpiresByType text/css "access plus 2592000 seconds"
 ExpiresByType text/javascript "access plus 2592000 seconds"
 ExpiresByType text/html "access plus 7200 seconds"
 ExpiresByType application/xhtml+xml "access plus 7200 seconds"
 ExpiresByType application/javascript A259200
 ExpiresByType application/x-javascript "access plus 2592000 seconds"
 ExpiresByType application/x-shockwave-flash "access plus 2592000 seconds"
</ifmodule>
# END Expire headers

Désactiver les Etags

Le ETag fait partie du protocole HTTP, c’est un mécanismes qui influe sur le cache, permettant à la base, d’être plus efficace. Il sert en loccurence à renseigner (a l’aide de requête) les mises à jour faites sur le site. ici, nous proposons de les désactiver (car ce renseignement sera donnée d’une autre façon au serveur, inutile donc de le faire doublement), ce qui nous permettra de diminuer le nombre de requête et donc d’optimiser la bande passante. Pour se faire, les lignes suivantes sont à rajouter:

# KILL THEM ETAGS
Header unset ETag
FileETag none

Pour WordPress

Les étapes ci-dessus vous concernent si vous utilisez wordpress, et vous permettent même d’éviter certains plugins de “compression” de fichier, de mise en cache ou autre. En effet, ces plugins sont souvent compliqués a installer et configurer, doivent être souvent mis à jour, génère des erreur, crééent des dossiers et des fichiers supplémentaires: Tout cela peut être évité en optimisant votre fichier .htaccess !

Par défaut, il doit y avoir une première partie dans votre fichier, qu’il faut conserver:

# BEGIN WordPress
<ifmodule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ – [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</ifmodule># END WordPress

Il est indispensable de protéger votre fichier wp-config. Ce fichier contient toutes les informations de connexion à votre site et votre base de données, un vrai trésor pour les hackers.
Pour sécuriser ce fichier, il suffit d’ajouter le code suivant dans votre fichier .htaccess:

# protect wpconfig.php
<files wp-config.php>
order allow,deny
deny from all
</files>