Voici un cas d’utilisation du mod url rewrite d’Apache assez peu documenté. En effet, je souhaite réécrire une url comportant une portion d’url encodée – dans mon cas généré avec la fonction urlencode de PHP.

La réécriture Apache et l’url encodée ne fonctionnent pas !

Je souhaite réécrire l’url suivante et récupérer la valeur http%3A%2F%2Ftilap.net%2F pour la passer en argument à un script.

http://host.tld/http%3A%2F%2Ftilap.net%2F

La règle de réécriture est simple. Par exemple dans le fichier .htaccess :


# Enable rewrite mod
RewriteEngine on
# Root path
RewriteBase /
# Ignore rules on final file
RewriteRule ^index\.php$ - [L]
# if folder or file does not exists
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# rewrite by sending the url to the main script
RewriteRule ^(.*)$ /index.php?url=$1 [L,QSA]

Malheureusement, ça ne fonctionne pas (erreur interne). Pourtant la règle de réécriture est correcte…

La directive AllowEncodedSlashes

L’astuce malicieuse tient dans la directive Apache AllowEncodedSlashes. Elle détermine si les séparateurs de chemin encodés sont autorisés à transiter dans les URLs. Et par défaut, elle est à Off.

Il vous suffit donc de la passer à On pour votre VirtualHost et de restarter votre Apache pour que la réécriture ci dessus fonctionne.

AllowEncodedSlashes On

A noter que cette directive est appliquée à tout le VirtualHost et ne peut être mise dans votre fichier htaccess.

Pour aller plus loin, je vous recommande la doc officielle Apache sur la directive AllowEncodedSlashes.