Configurer le .htaccess pour des performances et une sécurité optimales

nseo
Comment protéger votre site du « negative SEO » ?
1 février 2015
sitemap-xml
Performance SEO et Sitemap.xml
7 février 2015

Configurer le .htaccess pour des performances et une sécurité optimales

htaccess

Si vous pensez qu’un apache c’est un indien avec des plumes dans les cheveux alors cet article devrait vous apprendre deux ou trois choses pour le moins intéressantes !

Apache c’est tout simplement le serveur HTTP le plus utilisé sur le web. Apache c’est la référence mondiale en terme de serveur, il est tout particulièrement apprécié pour sa stabilité, son caractère évolutif et modulable. Le serveur Apache est également caractérisé par un fichier racine : le .htaccess 

 

Le .htaccess, mais c’est quoi ?!?

Derrière ce nom barbare se cache en réalité un véritable « couteau suisse » qui va permettre à un référenceur et/ou à un développeur de faire absolument tout ce dont ils ont toujours rêvé ou du moins tout ce qui est nécessaire au bon fonctionnement d’un site Internet, à savoir :

  1. Réécriture d’URL (URL Rewriting)
  2. Redirections
  3. Protection de fichier ou de répertoires
  4. Protection contre les hotlinks (vol de bande passante)
  5. Optimisation du cache et donc du temps de chargement
  6. Bannissement des IP et Robots
  7. etc

Comment configurer votre .htaccess

En préambule, il convient de préciser que les règles énoncées ci-dessous ne sont pas forcément « plug and play » et doivent faire l’objet de tests poussés de votre part si vous décidez de les réinvestir sur votre serveur Apache. En conséquence, la première chose à faire est de réaliser une copie de votre .htaccess via votre FTP, on n’est jamais trop prudent.

Rewriting

Normalement votre .htaccess devrait commencer par des règles de réécriture propres à votre CMS .L’exemple ci-dessous illustre les règles de réécriture pour WordPress.

# 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

Compression

On continue avec l’activation de la compression permettant de réduire le temps de réponse des requêtes HTTP. Ce qui améliore le temps de chargement et diminue la consommation de la bande passante.

 # 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

Concernant la compression, il existe également le GZIP qui est un peu plus performant que le DEFLATE mais pas forcément toujours compatible avec votre installation, à tester !

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>

Mise en cache

On fixe la durée d’expiration pour un grand nombre d’extensions. Ainsi le navigateur garde des éléments en cache et de fait le nombre de requête serveur est diminué.

# 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
# 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

Etags

Désactivation des Etags : le Etag permet au navigateur et au serveur d’échanger pour savoir si un document a été ou non modifié depuis la dernière fois. Dans la mesure où vous fixez la durée de cache (voir plus haut), cette information devient inutile, vous fait consommer de la bande passante et  vous ralentit pour rien. Par conséquent, il est préférable de supprimer les Etags.

# KILL THEM ETAGS
 Header unset ETag
 FileETag none

Sécurité

Le .htaccess vous permet de bloquer l’accès à des fichiers sensibles, comme le wp-config.php dans le cas de WordPress ou du .htaccess dans le cas de n’importe quel serveur Apache.

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

Une protection intéressante concerne la protection de la lecture des répertoires, laquelle devrait empêcher un hacker de se balader librement dans votre index.

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

Enfin, les lignes ci-dessous protègeront vos images contre les hotlinks et donc le vol de bande passante.

# hotlink protect
 RewriteCond %{HTTP_REFERER} !^http://monsite.com/.*$      [NC]
 RewriteCond %{HTTP_REFERER} !^http://monsite.comr$      [NC]
 RewriteCond %{HTTP_REFERER} !^http://www.monsite.com/.*$      [NC]
 RewriteCond %{HTTP_REFERER} !^http://www.monsite.com$      [NC]
 RewriteRule .*\.(jpg|jpeg|gif|png|bmp)$ - [F,NC]

Gestion de la mémoire

Parfois la quantité de mémoire accordée par défaut est un peu faible, vous pouvez utiliser cette ligne de commande dans votre .htaccess pour l’augmenter.

# Memory Limit
php_value memory_limit 512M

Exclusion

Si vous souhaitez bannir des IP ou des plages d’ip voici la commande à installer :

# IP exclusion
Order Allow,Deny
Allow from all
Deny from 123.456.789.123

Remarque : dans le cas d’une preprod il est tout à fait judicieux d’utiliser cette technique mais de façon inverse en bloquant toutes les IP sur votre serveur de preprod à l’exception de la votre et de celles de vos prestataires.

# IP exclusion server prod
Order Allow,Deny
Deny from all
Allow from 123.456.789.123 

Si vous souhaitez bannir certains robots crawlers qui consomment inutilement vos ressources serveur:

# Robots aspirateurs de site
RewriteCond %{HTTP_USER_AGENT} HTTrack                 [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Net\ Vampire                 [NC,OR]
RewriteRule ^(.*)$ http://www.google.com [R=301]

 

Une fois l’ensemble de ces modifications implémentées, il ne vous reste plus qu’à tester vos performances et c’est la que ça se passe :

Performance d’affichage : Gtmetrix.com et Webpagetest.org

Test de compression : Gidnetwork.com

 

Fabrice PEZOUS
Fabrice PEZOUS
Dans la vie, j'ai un métier et une passion : le SEO ou référencement de sites Internet que j'exerce en tant que Consultant Freelance SEO. J'ai travaillé pour des TPE, des PME, des Pure Players dans des domaines variés comme l'assurance, les loisirs (voyage,sport), la restauration, etc Si vous avez un site Internet avec des soucis de SEO, contactez moi, je peux vous aider.

1 Comment

  1. EM dit :

    Voilà donc un bon article, bien passionnant. J’ai beaucoup aimé et n’hésiterai pas à le recommander, c’est pas mal du tout ! Elsa Mondriet

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *