Htaccess

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
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

Voir aussi