Description
Le fichier de configuration «.htaccess» permet d'indiquer à Apache des règles que doit appliqués au serveur Web lorsque certains URL sont demandées. Ainsi, il offrira la possibilité de demander une authentification, d'effectuer des redirections avec de contextes précises (rediriger www.gladir.com vers un nom de domaine iphone.gladir.com si c'est un iPhone par exemple).
Structure du fichier
Le fichier contient un format de configuration classique avec le caractère «#» pour les remarques. Toutefois, il contient également des balises regroupement des associations particulières.
Syntaxe
parametre valeur |
Paramètres
Nom | Description | Prérequis | ||
---|---|---|---|---|
AddType valeur | Ce paramètre permet d'indiquer le type MIME à appliquer à un répertoire. | |||
Allow valeur | Ce paramètre permet d'indiquer que les accès autorisés. | |||
AuthDigestAlgorithm valeur | Ce paramètre permet d'indiquer s'il faut effectuer le calcul de l'algorithme de la réponse haché dans le processus d'authentification. Voici les valeurs supportées : | mod_auth_digest | ||
Valeur | Description | |||
MD5 | Cette valeur permet d'indiquer qu'il faut uniquement calculer avec la réponse. | |||
MD5-sess | Cette valeur permet d'indiquer qu'il faut effectuer le calcul de la réponse en fonction de la session. Cette valeur n'est pas encore intégrée. | |||
AuthDigestDomain valeur | Ce paramètre permet d'ajouter la condition qu'il doit correspondre au nom de domaine spécifié. | mod_auth_digest | ||
AuthDigestNonceLifetime valeur | Ce paramètre permet d'indiquer combien de temps un nonce de serveur est valide. | mod_auth_digest | ||
AuthDigestProvider valeur | Ce paramètre permet de fixer le fournisseur authentifiant les utilisateurs par cet emplacement. | mod_auth_digest | ||
AuthDigestQop valeur | Ce paramètre permet de fixer la qualité de protection pour l'authentification. Les valeurs reconnues sont : | mod_auth_digest | ||
Valeur | Description | |||
none | Cette valeur permet d'indiquer aucune authentification n'est effectué. | |||
auth | Cette valeur permet d'indiquer une simple authentification. | |||
auth-int | Cette valeur permet d'indiquer une authentification avec une vérification d'intégrité MD5. | |||
AuthDigestShmemSize valeur | Ce paramètre permet de fixer la quantité de mémoire partagée pour le suivi du traçage des clients. | mod_auth_digest | ||
AuthUserFile valeur | Ce paramètre permet d'indiquer le nom du fichier avec le chemin des mots de passe à appliquer. | |||
AuthGroupFile valeur | Ce paramètre permet d'indiquer le nom du fichier avec le chemin du groupe à appliquer. | |||
AuthName valeur | Ce paramètre permet d'indiquer le nom de la demande d'authentification. | |||
AuthType valeur | Ce paramètre permet d'indiquer le type d'authentification. On utilise généralement «Basic». | |||
DefaultType valeur | Ce paramètre permet d'indiquer le type MIME par défaut. | |||
Deny valeur | Ce paramètre permet d'indiquer que les accès refusés. | |||
DirectoryIndex valeur | Ce paramètre permet d'indiquer le fichier d'index par défaut. Sous Apache, il s'agit généralement d'«index.html» tandis que sous IIS, c'est «default.html». | |||
ErrorDocument valeur | Ce paramètre permet d'indiquer un code d'erreur personnalisé du serveur Web. | |||
ForceType valeur | Ce paramètre permet de forcer l'utilisation du type MIME spécifié par tous les répertoires et fichiers. | |||
Order valeur | Ce paramètre permet d'indiquer l'ordre de priorité des paramètres Allow, Deny,... | |||
Require valeur | Ce paramètre permet d'indiquer que seul l'utilisateur spécifié a le droit d'y accéder. | |||
RewriteBase valeur | Ce paramètre permet d'indiquer l'URL de base pour la réécriture de répertoire. | |||
RewriteCond valeur | Ce paramètre permet d'indiquer une condition à appliquer à un URL. | |||
RewriteEngine valeur | Ce paramètre permet d'indiquer s'il vaut activer la réécriture URL. | |||
RewriteRule valeur | Ce paramètre permet d'indiquer une règle à appliquer à un URL. Voici les drapeaux de règles indiquant entre les braquets (on peut les combiner en les séparants par des virgules) : | |||
Valeur | Description | |||
L | Cette valeur permet d'indiquer si la règle s'applique, qu'aucune autre règle n'est appliqué après celle-ci. Il est conseillé de mettre cette option pour accélérer le traitement si vous n'avez pas de combinaison de règle. | |||
NC | Cette valeur permet d'indiquer qu'il ne faut pas de différence entre les majuscules et minuscules. | |||
NS | Cette valeur permet d'indiquer qu'il ne faut pas appliquer la règle aux sous-requêtes. | |||
QSA | Cette valeur permet d'indiquer qu'il faut supprimer la partie correspondante de la requête (indiqué généralement par «?»). | |||
R | Cette valeur permet d'indiquer qu'il faut demander une redirection au navigateur Web. | |||
R=301 | Cette valeur permet d'indiquer qu'il faut demander une redirection permanente au navigateur Web. Si vous risquez de changer cette redirection dans quelques heures, jours, semaine ou mois, vous devriez plutôt utiliser une redirection temporaire. | |||
R=302 | Cette valeur permet d'indiquer qu'il faut demander une redirection temporaire au navigateur Web. | |||
... | ... | |||
Satisfy valeur | Ce paramètre permet d'obliger un utilisateur à satisfaire une ou plusieurs conditions. | |||
SetEnv valeur | Ce paramètre permet de fixer des variables d'environnement pour les interpréteurs de script comme PHP. | |||
SSLRequireSSL | Ce paramètre permet d'indiquer qu'il faut uniquement accepter le HTTPS et refuser le HTTP | mod_ssl | ||
SSLVerifyClient valeur | Ce paramètre permet d'indiquer qu'il faut effectuer une vérification SSL du côté client. La valeur par défaut est «none». Les valeurs autorisées sont : | mod_ssl | ||
Valeur | Description | |||
none | Cette valeur permet d'indiquer qu'aucun certificat n'est requis pour tous. | |||
optional | Cette valeur permet d'indiquer que le client peut présenter un certificat valide. | |||
require | Cette valeur permet d'indiquer que le client doit présenter un certificat valide. | |||
optional_no_ca | Cette valeur permet d'indiquer que le client peut présenter un certificat valide, sans toutefois le vérifier. |
Remarques
- Il est très dangereux de ne pas tester le résultat d'une redirection. Pour se faire, un peut utiliser des sites Web comme http://htaccess.madewithlove.be/ permettant de tester les règles de réécriture. Dans le même ordre d'idée, on peut tester uniquement les expressions régulières à l'aide du site suivant http://regexpal.com/.
- Il est préférable de toujours commencer le fichier .htaccess avec le paramètre «RewriteEngine On», car se paramètre pourrait être désactiver par défaut par le serveur Web Apache.
- Si vous pouvez mettre les redirections dans le «vhosts.conf» (httpd.conf) plutôt que le «.htaccess», vous risquez d'obtenir des performances étant jusqu'à 10 fois plus rapides qu'en utilisant ce fichier. Oui, le fichier «.htaccess» est plus flexible, mais c'est aussi au détriment de la rapidité de réaction de votre système. Ce détail en apparence anodin, risque d'être fort intéressant si vous site Web subit un fort trafic.
- Si vous souhaitez héberger uniquement certaines pages spécifiques sur un autre serveur externe à votre hébergeur, vous devriez utiliser les paramètres «ProxyPass», «ProxyPassReverse», «ProxyRequests» et «ProxyVia» du module «mod_cache». Ses paramètres permettent d'effectuer des opérations «Mandataire inverse» et «Mandataire direct».
- Si vous avez un point d'interrogation (?) dans votre URL de paramètre «RewriteRule», vous devrez utiliser la variable «{QUERY_STRING}» pour le traiter. Par exemple pour une URL dans le genre «index.php?id=2», vous devrez utiliser la condition suivante «RewriteCond %{QUERY_STRING} ^id=2$»
- Vous pouvez utiliser le plugins de Firefox «HttpFox» afin de suivre toutes les redirections qu'un «.htaccess» provoque sur un site Web en production. Il est accessible par le raccourci clavier Ctrl+Shift+F2. Si la situation devient plus compliqués, par exemple, la communication entre différents serveur, vous n'aurez sans pas le choix d'utiliser l'application Fiddler de Telerik.
- ATTENTION ! Si vous sauvegardez un URL dans vos favoris d'un compte Google (comme par exemple avec Synchronisation Google Chrome) sur un téléphone ou une tablette et qu'ensuite, vous l'utilisez sur un ordinateur de bureau, alors il ne fonctionnera pas correctement parce que le contenu est personnalisé pour la plateforme. Il ne faut pas oublier que de nombreux sites ont tendance à modifier le lien en utilisant le «USER_AGENT». Exemple : «mobile.gladir.com/CODER/» redirigera en «www.gladir.com/CODER/» par exemple, mais les liens n'ont plus le même sens dans le «www». Il faudra donc tenir compte de cette situation lors de vos redirections car sinon vos utilisateurs ce retrouveront dans une mauvaise page. Bien sûre cette situation ne s'applique pas si vous utilisez le «Responsive Web Design» !
- Si vous souhaitez utiliser ce fichier sur un serveur IIS, vous devrez envisager d'utiliser le module de compatibilité «ISAPI_Rewrite» de l'entreprise «Helicon», lequel pourra conserver le même fichier sans modification de votre part ou bien de convertir vos fichiers «.htaccess» en format «Web.Config» avec la balise <rules> dans <rewrite> d'ASP.NET.
- 301 : Une redirection permanente ne contient pas de date d'expiration et si vous effectuez une redirection avec cette valeur, elle peut être conservée indéfiniment dans le navigateur et non pas 30 jours comme la rumeur le prétend. Cependant, la durée de vie avant que le navigateur revérifie peut varier d'un navigateur à l'autre, et cela ne correspond pas à une règle officielle. Ainsi, la norme «RFC 4437» propose une balise «<!ELEMENT redirect-lifetime (permanent | temporary)>» mais il ne semble pas appliqué par la plupart des navigateurs.
- Il est possible de vérifier le bon fonctionnement d'une redirection absolue devant se produire sur une serveur de production avec un poste locale en modifiant le fichier «hosts» afin de lui associer l'IP de la machine locale (127.0.0.1) avec votre nom de domaine de production.
- Inclusion de fichiers externes : Il n'est pas possible d'inclure un autre fichier dans un fichier «.htaccess» avec une instruction «Include», si vous souhaitez effectuer cette opération, vous devrez plutôt passer par le «vhosts.conf» (httpd.conf) et l'ajouter entre les balises «VirtualHost».
- Si vous rencontrez une erreur :
Redirect: invalid first argument (of three) |
elle est souvent provoquer par le fait que l'URL que vous avez copié contient un ou plusieurs espaces et les URL ne sont pas autorisés à contenir des espaces, vous devrez donc remplacer les espaces par un «%20». Dans l'éventualité contraire, vous avez rajouter un troisième paramètre non reconnu.
Exemples
##Redirection du dossier /asp vers www.gladir.com/CODER/ASP/ RewriteEngine On RewriteRule ^asp$ http://www.gladir.com/CODER/ASP/ [R=301,L] |
Voici un autre exemple permettant de transformer l'URL suivant «http://www.gladir.com/infoletter-formulaire/?error=login» sous la forme «http://www.gladir.com/index.php?controllerName=newsLetter&action=ns&error=login» :
RewriteCond %{QUERY_STRING} ^error=login$ RewriteRule ^infoletter-formulaire/$ index.php?controllerName=newsLetter&action=ns&error=login [L] |
Voici un exemple permettant de rediriger tous les liens de «gladir.ca» vers «gladir.com» en conservant les chemins de l'URL s'il est situé dans la racine du site Web :
RewriteEngine On RewriteCond %{HTTP_HOST} ^([\w-]+\.)*gladir\.ca$ [NC] RewriteRule (.*) http://%1gladir.com/$1 [L,NC,QSA,R=301] |
L'exemple suivant permet de refuser tous les IP sauf le «localhost» :
<Limit GET POST> order deny,allow deny from all allow from 127.0.0.1 </Limit> |
L'exemple suivant permet de refuser tous les IP sauf le réseau local (si vous utilisé une plage réseau entre 192.168.0.0. et 192.168.255.255) :
<Limit GET POST> order deny,allow deny from all allow from 192.168. </Limit> |
L'exemple suivant permet d'effectuer une redirection vers http vers https :
RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] |
L'exemple suivant permet d'effectuer une redirection vers http si vous êtes sur du https :
RewriteCond %{HTTPS} on RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [R,L] |
L'exemple suivant permet d'effectuer une redirection vers http sur des entêtes https sont rencontrées :
RewriteCond %{HTTP:X-Forwarded-Proto} https RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [R,L] |
L'exemple suivant permet d'indiquer qu'il faut effectuer une redirection de tous les https vers http sauf pour les dossiers «/admin» et «/secure» :
RewriteCond %{HTTPS} on RewriteCond %{REQUEST_URI} !^(/admin/|/secure/)([\w-]+\.)* [NC] RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] |
L'exemple suivant permet de rediriger tous le site «gladir.ca» vers «gladir.com» en conservant les adresses URL à l'exception de la page «nagios.php» situé dans la racine :
RewriteEngine On RewriteCond %{HTTP_HOST} ^([\w-]+\.)*gladir\.ca$ [NC] RewriteCond %{REQUEST_URI} !^/nagios\.php [NC] RewriteRule (.*) http://%1gladir.com/$1 [L,NC,QSA,R=301] |
L'exemple suivant permet de rediriger uniquement le lien suivant «http://www.gladir.com/dossiers/index.php?id=32» vers «http://www.gladir.com/CODER» :
RewriteCond %{QUERY_STRING} ^id=32$ RewriteRule ^dossiers/index\.php$ /CODER? [R=301,L] |
L'exemple suivant permet de provoquer une redirection vers une page de maintenance uniquement pour les réseaux domestiques (192.168.0.x) :
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REMOTE_ADDR} !127\.0\.0\.1 RewriteCond %{REMOTE_ADDR} !192\.168\. RewriteRule (.php) page-maintenance/index.html [L] </IfModule> |
L'exemple suivant permet de rediriger la page d'accueil de «monsitea» vers une page spécifique «/Nouvelles/» (redirect only root) et les autres liens reste inchangé à l'exception du nom de domaine remplaçant «monsitea» par «monsiteb» (redirect not root) :
RewriteCond %{HTTP_HOST} ^([\w-]+\.)*monsitea\.com$ [NC] RewriteCond %{REQUEST_URI} ^/$ Rewriterule ^(.*)$ http://www.monsiteb.com/Nouvelles/ [L,R=301] RewriteCond %{HTTP_HOST} ^([\w-]+\.)*monsitea\.com$ [NC] RewriteCond %{REQUEST_URI} !^/$ RewriteRule (.*) http://%1monsiteb.com/$1 [L,NC,QSA,R=301] |
L'exemple suivant permet d'interdire les appels externes au site Web sur l'API XML-RPC de WordPress :
RewriteCond %{HTTP_HOST} !localhost RewriteRule /xmlrpc.php - [R=403,NC,L] |
Voir également
Index des extensions de fichier - Format de fichier : .htpasswd
Index des extensions de fichier - Format de fichier : httpd.conf
Références des codes d'erreurs - 500 Internal Server Error
Langage de programmation - Perl - Les expressions régulières
Articles - Redirection Web