Les erreurs classiques rencontrées sur , les solutions clef-en-main pour les besoins les plus courants, et tous les petits trucs à savoir sur sont ici.

RewriteRule Flags

Les RewriteRule ... ... [flags] proposent des flags à rajouter après la règle (plus d’infos en fin d’article).

Béchappe les retours arrière
CO=Nom:Valeur:Domaine:Durée de vie:Path:Secure?:HttpOnly?crée un cookie
Cchaine la règle à la suivante
ENDTermine complètement la réécriture
FHTTP 403 Forbidden
GHTTP 410 Gone
HMIMEType pour le
LTermine la réécriture
NReprend la réécriture à zéro, attention aux boucles
NCrègle insensible à la casse
QSAQuery String Append
QSDQuery String Discard
R=...retourne un HTTP indiqué
S=...saute les … prochaines règles
T=MIMETypeindique le MIMEType pour le client

Une RewriteCond pour N RewriteRule

Inversez la RewriteCond (!) et passez les N règles RewriteRule qui la suivent via [S=...]. Cela émulera les structures if (&) { … } qu’Apache ne supporte pas dans les .htaccess.

RewriteCond !{condition}
RewriteRule ... - [S=...]

#Mes RewriteRules qui doivent être appliquées si {condition} est VRAIE
RewriteRule ...

Des variables dans un .htaccess

Utilisez les variables d’environnement RewriteRule … [E=Nom:Valeur], puis utilisez-la via %{ENV:Nom} ou via %n dans une RewriteCond (qui fait alors référence au n-ieme groupe matché).

RewriteRule … [E=Nom:Valeur]

# Réutilisable via %{ENV:Nom}
RewriteCond %{Nom} ^(www\.)…(…)
RewriteRule . %2 [L]
# %1 = (www\.) et %2 = (…)

Déboguer une erreur HTTP 500

  • Vérifiez ce qui se trouve dans le log d’Apache, vous y trouverez surement du détail sur votre erreur
  • Vérifiez les logs d’accès d’Apache, pour trouver la variable/query string/URI qui est en cause, et vérifiez qu’elle ne soit pas exotique (UTF-8 multi-byte)
  • Testez sans cookie ni paramètre GET/POST, pour vérifier s’il s’agit d’une erreur dans l’URI (corrigez alors votre .htaccess ou httpd.conf)
  • Testez une URI plus basique, pour voir si une RewriteRule génère votre soucis
  • Testez sans votre .htaccess, et si tout marche, vous avez une erreur dedans

N’installez pas Apache dans un dossier dont le nom contient [ ]

Ces crochets “cassent” la configuration d’Apache, et génèrent une erreur. Cette erreur n’est pas remontée dans les log Apache, et ce dernier répond alors une simple HTTP 500 sans plus de précision.

Je vous invite donc à ne pas installer Apache dans un dossier dont le nom contient des crochets [ ], voire aucun caractère spécial. Cela vaut également pour tous les dossiers parents. Evitez donc c:\programmes\Apache[x64] et c:\programmes[x64]\Apache, au profit de c:\programmes\Apache-x64.

Les RewriteRule matchent octet par octet

Dans les RewriteRule d’Apache, . = 1 octet. Or, en UTF-8, certains caractères prennent plusieurs octets, comme qui occupe deux octets (0x66 0x2f). Un seul . ne le marchera pas.

Par exemple, supposons qu’un article de blog ne puisse faire que 200 caractères de long. Votre redirection Apache actuelle peut être, RewriteRule ^/article/([0-9]+)-.{1,200}$ mais celle-ci ne matchera pas les titres longs, contenant des caractères accentués. En effet, en multi-byte, un titre de 200 caractère peut aller jusqu’à 800 octets (en considérant au plus 4 octets par caractère). La regex Apache doit donc faire jusqu’à 800 caractères et devenir RewriteRule ^/article/([0-9]+)-.{1,800}$. Elle peut aussi être non-limitante, RewriteRule ^/article/([0-9]+)-.+$.

Liens utiles