Utilisation
Un fichier .htaccess sert à la configuration de serveur Apache. Il est situé dans les dossiers du site web et la portée de la configuration est limitée au contenu du répertoire où il est situé. Il est donc possible d'avoir des configurations différentes selon le chemin désirer.
Afin qu'Apache puisse utiliser les configurations dans un fichier .htaccess, le dossier doit le permettre avec la directive suivante :
<Directory /le/chemin/du/dossier>
# Pour permettre toutes les configurations possibles
AllowOverride All
</Directory>
Référence : Documentation Apache
Filtrage d'adresse IP
Les fichiers .htaccess permettent le filtrage d'adresses IP.
Pour bloquer une adresse IP il faut rajouter au .htaccess :
Deny from X.X.X.X
Vous pouvez aussi bloquer plusieurs adresses IP :
Deny from all
La gestion des pages d'erreurs
Apache fournit une page générique affichant une erreur lorsqu'une ressource ne peut être accédée directement. Il est possible de créer une page d'erreur personnalisée et de la mentionner dans le fichier .htaccess de la manière qui suit :
ErrorDocument 404 /404.html
ErrorDocument 500 /500.html
Redirection de pages
Il est possible de créer des redirections temporaire (302) ou permanente (301) en utilisant la méthode suivante :
Redirect 301 /old-page.html https://www.webo3.ca/new-page.html
Redirect 302 / https://www.webo3.ca/maintenance.html
Réécriture d'URL
Les fichiers .htaccess permettent également de réécrire les URL afin de les simplifier. Par exemple, une URL du type :
https://www.webo3.ca/index.php?page=contact
Peut être transformée en :
https://www.webo3.ca/contact
Le .htaccess contiendra :
RewriteEngine on
RewriteRule ^contact$ index.php?page=contact [L]
Pour obtenir plus d'information sur le module "rewrite" d'Apache consultez : https://httpd.apache.org/docs/2.4/fr/mod/mod_rewrite.html.
Configuration suggérée
Afin d'avoir de meilleures performances, il est suggéré d'utiliser les configurations suivantes afin de compresser (gziper) ainsi que d'activer la cache de navigateur. Le fichier .htaccess suivant comprend aussi de l'information pour faire des redirections HTTPS et quelques éléments de sécurité.
# Contrôler les entêtes.
<IfModule mod_headers.c>
Header set X-UA-Compatible "IE=edge"
Header set X-Content-Type-Options nosniff
Header always append X-Frame-Options SAMEORIGIN
</IfModule>
# Permettre l'accès aux fonts.
<FilesMatch "\.(ttf|otf|eot|woff|woff2)$">
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
</IfModule>
</FilesMatch>
# S'assurer que les extensions de fichier sont du bon type MIME.
<IfModule mod_mime.c>
# Audio
AddType audio/mp4 m4a f4a f4b
AddType audio/ogg oga ogg
# JavaScript
# Normalize to standard type (it's sniffed in IE anyways):
# http://tools.ietf.org/html/rfc4329#section-7.2
AddType application/javascript js
AddType application/json json
AddType text/css css
# Video
AddType video/mp4 mp4 m4v f4v f4p
AddType video/ogg ogv
AddType video/webm webm
AddType video/x-flv flv
# Web fonts
AddType application/font-woff woff
AddType application/vnd.ms-fontobject eot
# Browsers usually ignore the font MIME types and sniff the content,
# however, Chrome shows a warning if other MIME types are used for the
# following fonts.
AddType application/x-font-ttf ttc ttf
AddType font/opentype otf
# Make SVGZ fonts work on iPad:
# https://twitter.com/FontSquirrel/status/14855840545
AddType image/svg+xml svg svgz
AddEncoding gzip svgz
# Other
AddType application/octet-stream safariextz
AddType application/x-chrome-extension crx
AddType application/x-opera-extension oex
AddType application/x-shockwave-flash swf
AddType application/x-web-app-manifest+json webapp
AddType application/x-xpinstall xpi
AddType application/xml atom rdf rss xml
AddType image/webp webp
AddType image/x-icon ico
AddType text/cache-manifest appcache manifest
AddType text/vtt vtt
AddType text/x-component htc
AddType text/x-vcard vcf
</IfModule>
# Activer la compression.
<IfModule mod_deflate.c>
# Forcer la compression.
<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>
# Compresser les différents MIME-types
<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>
# Activer la cache
<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-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>
# Enlever l'affichage des fichiers si le dossier est vide.
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
# Réécriture
<IfModule mod_rewrite.c>
RewriteEngine On
# ----------------------------------------------------------------------
# Ajouter "www." au début de l'URL.
# ----------------------------------------------------------------------
RewriteCond %{HTTP_HOST} !^www\..+$ [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# ----------------------------------------------------------------------
# Forcer l'utilisation SSL.
# ----------------------------------------------------------------------
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# ----------------------------------------------------------------------
# Bloquer l'accès aux fichiers cachés à l'exception du dossier
# .well-known qui est utilisé pour générer des certificats SSL.
# ----------------------------------------------------------------------
RewriteRule "(^|/)\.well-known" - [S=1]
RewriteRule "(^|/)\." - [F]
# ----------------------------------------------------------------------
# Redirection des barres obliques s'il ne s'agit pas d'un dossier.
# ----------------------------------------------------------------------
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
# ----------------------------------------------------------------------
# Redirection vers un contrôleur de script (index.php).
# ----------------------------------------------------------------------
# RewriteCond %{REQUEST_FILENAME} !-d
# RewriteCond %{REQUEST_FILENAME} !-f
# RewriteRule ^ index.php [L]
# ----------------------------------------------------------------------
# Ajout des informations d'authorisation pour être lisible par un script.
# ----------------------------------------------------------------------
# RewriteCond %{HTTP:Authorization} .
# RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
</IfModule>