Nous avons un serveur configuré comme suit :
- Windows 2012 R2
- Coldfusion 10, Entreprise
- IIS, configuré avec une page d'erreur 404 personnalisée (exécutée sur le serveur)
La page d'erreur personnalisée (un fichier CFM) gère les URL manquantes et les vérifie par rapport aux URL personnalisées dans la base de données. Si elle trouve une correspondance, elle affichera les données pertinentes. Le problème survient lorsque l'URL personnalisée est associée à un fichier CFM inexistant ; par exemple.
/home/map.cfm (pas un vrai fichier ou répertoire)
Maintenant, lorsqu'un utilisateur demande cette URL, le serveur voit qu'il s'agit d'un fichier CFM et le transmet correctement à ColdFusion (via la redirection ISAPI). Tomcat voit que ce fichier n'existe pas réellement et renvoie une erreur 404. IIS voit ce message d'erreur 404 et exécute la page d'erreur personnalisée (/errors/404.cfm).
Les variables CGI résultantes ne nous permettent pas en réalité de récupérer l'URL originale (pour la mapper vers une URL virtuelle dans la base de données), généralement fournie en tant que partie de la variable CGI.QUERY_STRING. Au lieu de cela, la variable QUERY_STRING contient le chemin du fichier 'isapi_rewrite.dll', dans le répertoire 'jakarta'.
Y a-t-il un moyen de conserver l'URL initialement demandée (d'un fichier CFM), après que Tomcat a renvoyé une erreur 404 pour ladite page ?
Solution, élaborée par moi-même, inspirée par Thomas Gorgolione
Comme je le soupçonnais, le problème venait invariablement du fait que la demande était transmise au module ISAPI_REDIRECT, même si le fichier en question n'existait pas.
Comme l'a suggéré Thomas, une solution élégante consiste à utiliser des réécritures pour vérifier que le fichier / répertoire existe réellement, avant de le transmettre au module ISAPI_REDIRECT.
Alors que le logiciel suggéré par Thomas aurait pu faire l'affaire, je n'ai pas pu l'installer sur une machine Windows 2012 R2 64bit. J'ai cependant réussi à me rabattre sur l'utilisation du module URL Rewrite inclus avec IIS8 (et éventuellement des versions antérieures).
Voir mon entrée web.config ci-dessous qui fournit une solution.
Le fichier de configuration ci-dessus prend en compte à la fois les requêtes HTTP et HTTPS. Il tiendra également compte du répertoire CFFileServlet, que ColdFusion utilise pour héberger des images et des ressources temporaires. Si l'URL commence par ce répertoire, elle sera transmise comme une requête normale.
Merci à tous pour vos contributions.