Htaccess
| Fiche express | |
|---|---|
| Type | Fichier de configuration par répertoire |
| Fichier | .htaccess
|
| Module requis | mod_rewrite (pour la réécriture d'URL)
|
| Voir aussi | Apache · Directives apache · Commandes apache |
.htaccess est un fichier de configuration Apache appliqué au niveau d'un répertoire (et
de ses sous-répertoires), lu à chaque requête sans nécessiter de redémarrage du serveur.
Pratique en hébergement mutualisé où l'on n'a pas accès à la configuration globale, mais coûteux
en performance à grande échelle (lu à chaque requête) — sur un serveur dédié, préférer les mêmes
directives directement dans un bloc <Directory> de la configuration
principale quand c'est possible.
Nécessite que AllowOverride autorise les directives utilisées pour le répertoire
concerné (voir Directives apache), et que mod_rewrite soit chargé pour toute
la partie réécriture d'URL ci-dessous.
Directives de réécriture
- Options +FollowSymlinks — autorise la résolution des liens symboliques (souvent requis
pour que la réécriture fonctionne correctement).
- RewriteEngine on/off — active/désactive le moteur de réécriture.
- RewriteOptions inherit — hérite des règles définies plus haut dans l'arborescence.
- RewriteOptions MaxRedirects=N — limite le nombre de redirections internes par requête
(10 par défaut).
- RewriteLog / RewriteLogLevel — journalisation du moteur de réécriture, utile en
debug (voir plus bas — retiré dans Apache 2.4, remplacé par LogLevel
rewrite:trace3).
- RewriteLock — fichier de verrou pour la synchronisation d'une RewriteMap externe.
- RewriteMap — déclare une table de correspondance externe utilisable dans les règles.
- RewriteBase — préfixe d'URL utilisé comme base pour les règles relatives.
- RewriteCond — condition préalable à l'application d'une
RewriteRule. - RewriteRule — règle de réécriture proprement dite : motif → substitution [drapeaux].
Vérifier que mod_rewrite est actif
apachectl -t -D DUMP_MODULES | grep rewrite_module
Test rapide de fonctionnement, à retirer une fois validé :
RewriteRule .* http://www.google.com [R]
Exemples de réécriture
Toujours activer le moteur avant toute règle :
RewriteEngine On RewriteRule URL_a_reecrire URL_reecrite [drapeau]
Rediriger les erreurs 404 vers un script dédié :
ErrorDocument 404 /erreur404.php
Exemple de traitement associé côté PHP (récupération du chemin demandé pour reconstruire un
paramètre) — attention : la fonction ereg() utilisée dans l'exemple d'origine
est dépréciée depuis PHP 5.3 et supprimée depuis PHP 7 ; utiliser preg_match() :
<?php
if (preg_match('#^/page-([0-9]+)\.html$#', $_SERVER['REDIRECT_URL'], $match)) {
header("Status: 200 OK", false, 200);
$_GET['param'] = $match[1];
$_REQUEST['param'] = $match[1];
include('page.php');
}
?>
URL "propres" pour une fiche produit (product.php?id=12 devient
product-12.html) :
RewriteRule ^product-([0-9]+)\.html$ product.php?id=$1
Variante avec un segment supplémentaire (catégorie), pour
product/nom-produit/12.html :
RewriteRule ^product/([a-zA-Z0-9_-]+)/([0-9]+)\.html$ product.php?id=$2
Rediriger un domaine sans www vers sa version avec www :
RewriteCond %{HTTP_HOST} ^example\.com$
RewriteRule (.*) http://www.example.com/$1 [R=301,L]
URL utilisateur "propre" (user.php?username=xyz devient /xyz) :
RewriteRule ^([a-zA-Z0-9_-]+)/?$ user.php?username=$1
Rediriger un domaine (ou son alias avec www) vers un sous-dossier de
public_html :
RewriteCond %{HTTP_HOST} ^test\.example\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.test\.example\.com$
RewriteCond %{REQUEST_URI} !^/new/
RewriteRule (.*) /new/$1
Sécuriser un répertoire ou un fichier
Authentification HTTP basique restreinte par groupe :
AuthUserFile /var/www/.htpasswd AuthGroupFile /var/www/.htgroup AuthName "Section reservee, veuillez vous identifier" AuthType Basic <Limit GET> require group Membres Admin </Limit> <LimitExcept GET> deny from all </LimitExcept>
Le fichier .htpasswd stocke les identifiants (hash apr1, généré avec
htpasswd) :
vi .htpasswd alice:$apr1$exemple$hash-a-generer-avec-htpasswd bob:$apr1$exemple$hash-a-generer-avec-htpasswd
Ne jamais éditer ces hachages à la main ni les copier depuis un autre fichier : les générer avec
htpasswd -B .htpasswd nom_utilisateur (option -B pour bcrypt, plus
robuste que l'ancien apr1 par défaut).
Les groupes sont gérés via un fichier séparé :
vi .htgroup Membres: alice bob carol Admin: bob
Mode debug
Sur Apache 2.2, la réécriture se déboguait via :
RewriteLog "/var/log/apache2/rewrite.log" RewriteLogLevel 3
(à vérifier / obsolète) : ces deux directives ont disparu avec Apache 2.4. Le débogage se fait désormais via le système de log générique :
LogLevel alert rewrite:trace3
Cas particulier : configuration pour un wiki MediaWiki
Pour obtenir des URL "propres" (/Nom_de_la_page plutôt que
/index.php?title=Nom_de_la_page) avec MediaWiki, définir dans
LocalSettings.php (en commentant la ligne $wgScriptPath déjà
présente par défaut) :
$wgScriptPath = ""; $wgArticlePath = "/$1"; $wgScriptExtension = ".php";
Puis créer un .htaccess à la racine du vhost :
Options +FollowSymlinks
RewriteEngine on
ErrorDocument 404 /index.php/erreur404
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteRule ^(.*)$ %{DOCUMENT_ROOT}/index.php [L,QSA]
RewriteRule ^/(.*)$ /index.php?title=$1 [PT,L,QSA]
RewriteRule ^/*$ /index.php [L,QSA]
# Redirection permanente vers le domaine canonique
RewriteCond %{HTTP_HOST} ^example.com [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]
Ressources
- Documentation officielle mod_rewrite : http://httpd.apache.org/docs/current/mod/mod_rewrite.html
Voir aussi
- Apache — vue d'ensemble du service
- Directives apache —
AllowOverrideet directives disponibles en.htaccess - Commandes apache — vérifier la configuration après modification