3 votes

ColdFusion 10 + IIS: URLs inexistants qui sont des fichiers CFM. Récupération de l'URL d'origine après l'exécution de la page 404

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.

3voto

Alcalyn Points 131

NOTE: La question ci-dessus inclut également une solution.

Je pense qu'il s'agit d'une erreur avec le Connecteur Coldfusion. Je publierais un rapport de bug à Adobe (https://bugbase.adobe.com/). J'ai cependant trouvé une solution de contournement. J'ai le même problème, mais j'utilise IIRF (Ionic IIS Redirector - http://iirf.codeplex.com/), et j'ai trouvé un moyen d'utiliser cela pour éviter le bug pour le moment:

  1. Supprimez toute configuration de fichier 404 précédente dans IIS/Coldfusion

  2. Installez IIRF normalement, selon les instructions d'installation.

  3. Dans le fichier IirfGlobal.ini (généralement situé dans C:\Windows\System32\inetsrv\IIRF), ajoutez la ligne suivante:

    RewriteFilterPriority HIGH

    Cela permettra à IIRF de gérer les demandes 404 avant même d'atteindre ColdFusion/Tomcat.

  4. Dans le Iirf.ini spécifique au site (généralement vous en créez un dans le dossier racine de vos fichiers Web - voir la documentation IIRF pour les détails), ajoutez les règles suivantes:

    RewriteCond %{SCRIPT_TRANSLATED} !-f
    RewriteCond %{SCRIPT_TRANSLATED} !-d
    RewriteRule ^(.+)$ page_to_redirect_to.cfm?404;$1 [L]

    Cela redirigera tous les fichiers/répertoires qui n'existent pas vers page_to_redirect_to.cfm, et ajoutera la chaîne de requête 404 comme d'habitude.

  5. EDIT: Ajouté une étape suivante: Entrez dans le Gestionnaire IIS et sélectionnez le serveur ou le site Web qui a été configuré pour utiliser IIRF, puis allez dans la section Filtres ISAPI. Cliquez sur "Voir la liste ordonnée", puis déplacez le filtre IIRF vers le haut.

EDIT 2: Vient de publier un bug à Adobe. Voir https://bugbase.adobe.com/index.cfm?event=bug&id=3630245

J'espère que cela vous aidera.

2voto

Miguel-F Points 6540

Laissez-moi commencer ma réponse en précisant que je suis toujours en train d'utiliser ColdFusion 9 donc je n'ai pas d'expérience directe avec la gestion des erreurs 404 dans ColdFusion 10 avec Tomcat. Évidemment, je devrai passer à la version 10 donc j'essaie de me familiariser avec ses subtilités (comme la gestion des erreurs 404). Alors j'ai fait quelques recherches.

Comme vous l'avez mentionné dans votre question, avec ColdFusion 9 et IIS le fichier initialement demandé est normalement contenu dans la variable CGI.QUERY_STRING précédé de "404;". Avec ColdFusion 10 et Tomcat il semble que d'autres variables CGI contiennent le fichier initialement demandé et cela dépend de votre configuration quel variable est-ce.

J'ai trouvé ce billet de blog de Raymond Camden - Reminder--there-is-more-to-the-CGI-scope-than-what-the-dump-shows. Bien que cela contienne de bonnes informations en lui-même j'ai également trouvé dans les commentaires par Jules Gravinese ce qui suit:

Lors de l'utilisation d' IIS7 la variable est CGI.HTTP_X_ORIGINAL_URL

Lors de l'utilisation de ISAPI_rewrite la variable est CGI.HTTP_X_REWRITE_URL

Lors de l'utilisation d' APACHE la variable est CGI.REDIRECT_URL

J'ai également trouvé d'autres articles mentionnant une variable CGI.REDIRECT_QUERY_STRING que je crois est également incluse lors de l'utilisation d' APACHE.


J'ai trouvé un autre article d'Adobe concernant les variables CGI et comment elles sont utilisées avec ColdFusion (et pourquoi ce n'est pas une liste complète): CGI environment (CGI Scope) variables.


REMARQUE: J'ai également trouvé ce bogue ColdFusion 10.0 - Bug 3488063: IIS 404 custom error handler URLs that are .cfm files do not consistently return entire document qui a été fermé mais plusieurs commentaires récents suggèrent que c'est toujours un problème. Donc soyez conscient de cela.

1voto

Shawn E Points 432

Utilisez la méthode OnMissingTemplate de l'Application.cfc pour gérer une page de modèle manquante.

Ajoutez ceci dans Application.cfc

Dans /errors/404.cfm ajoutez ceci près du haut

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X