J'ai découvert quelque chose d'étonnant :

Si vous ajoutez cette ligne dans un fichier htaccess :

Code:
ErrorDocument 404 http://www.site.com/erreur404.php


Logiquement, toutes les URL tapées qui ne pointent pas sur un fichier existant doivent être redirigées vers "erreur404.php".

Maintenant, si vous ajoutez l'équivalent ASCII du caractère "/" c'est à dire le code "%2F" dans l'url (de pratiquement tous les sites), on ne tombe pas sur la page d'erreur mais sur une erreur 404 basique.

Quelqu'un sait-il pourquoi apache interprete mal ces URL ?

Quelques exemples concrets :

Ici tout va bien :

Alors que là :


Ici tout va bien : http://openweb.eu.org/pagequinexistepas

Alors que là : http://openweb.eu.org/pagequinexistepas%2F
Modifié par dew (31 Jan 2009 - 15:26)
J'ai eu ce problème pas plus tard que la semaine dernière : besoin de transmettre un %2F dans l'url (peut être super-utile avec mod_rewrite, s'il faut des paramètres un peu spéciaux). Malheureusement, *boom*, Apache renvoie systématiquement une erreur 404 (il cherche même pas le ErrorDocument).

Une solution existe, à partir de Apache 2.0.46, c'est la directive AllowEncodedSlashes qui permet d'authoriser les slashs encodés. Maintenant ça marchouille bizarrement, à savoir qu'Apache va les transformer en / Smiley confus Donc suivant les cas ça ne changerait pas grand chose...
Je suis tombé sur cette erreur exactament pour les mêmes raisons que toi que :

Je voulais faire une réécriture d'URL et encoder mes slashes mais impossible de les faire passer sous cette forme. Paradoxalement, si ceux-ci ne sont pas encodés mais sont passés brut, aucun souci...

Je n'aurai pas accès à la configuration d'apache donc j'ai opté pour un système un peu "bidouille" :

ENCODAGE

$url = str_replace('/', '%2F', $url);
$url = rawurlencode($url);
// Résultat : double encodage des slashes

DECODAGE

$url = rawurldecode($url);
$url = str_replace('%2F', '/', $url);

Si quelqu'un a solution plus propre.

(Sur un serveur web Windows, ce n'est pas seulement le "/" qui crée une erreur. D'autres chaines comme %2A => * ne veulent pas passer et générent un Forbidden.)