tomcat iis coldfusion

tomcat - ColdFusion 10+IIS: URL inexistentes que son archivos CFM. Recuperando la URL original después de ejecutar la página 404



(3)

Tenemos una configuración de servidor de la siguiente manera:

  • Windows 2012 R2
  • Coldfusion 10, Enterprise
  • IIS, configurar con la página 404 personalizada (ejecutar en el servidor)

La página 404 personalizada (un archivo CFM) maneja las URL que faltan y las compara con las URL personalizadas en la base de datos. Si encuentra una coincidencia, mostrará los datos relevantes. El problema ocurre cuando la URL personalizada se asigna a un archivo CFM inexistente; por ejemplo.

/home/map.cfm (no es un archivo o directorio real)

Ahora, cuando un usuario solicita esta URL, el servidor ve que es un archivo CFM y lo pasa correctamente a ColdFusion (a través del redireccionamiento ISAPI). Tomcat ve que este archivo no existe en realidad, y devuelve un 404. IIS ve este mensaje 404 y ejecuta la página de error personalizado (/errors/404.cfm).

Las variables CGI resultantes no de hecho nos permiten recuperar la URL original (para asignarla a una URL virtual en la base de datos), generalmente proporcionada como parte de la variable CGI.QUERY_STRING. En cambio, la variable QUERY_STRING contiene la ruta al archivo ''isapi_rewrite.dll'', en el directorio ''jakarta''.

¿Hay alguna forma de conservar la URL solicitada originalmente (de un archivo CFM), después de que Tomcat haya devuelto un error 404 para dicha página?

Solución, creada por mí mismo, inspirada por Thomas Gorgolione

Como se sospechaba, el problema invariablemente se reducía a que la solicitud se enviara al módulo ISAPI_REDIRECT, incluso si el archivo en cuestión no existía.

Como sugirió Thomas, una solución elegante es utilizar reescrituras para verificar que el archivo / directorio realmente exista, antes de pasarlo al módulo ISAPI_REDIRECT.

Si bien el software que Thomas sugirió haría el truco, no pude conseguir que se instalara en una máquina de 64 bits de Windows 2012 R2. Sin embargo, me las arreglé para recurrir al módulo de reescritura de URL incluido con IIS8 (y posiblemente versiones anteriores).

Ver mi entrada web.config a continuación que proporciona una solución.

<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <httpErrors> <remove statusCode="404" subStatusCode="-1" /> </httpErrors> <rewrite> <rules> <rule name="404 HTTP"> <match url="(.*)" /> <conditions> <add input="{REQUEST_URI}" pattern="CFFileServlet/(.*)" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> <add input="{SERVER_PORT_SECURE}" pattern="0" /> </conditions> <action type="Rewrite" url="/404.cfm?404;http://{HTTP_HOST}:{SERVER_PORT}{REQUEST_URI}" /> </rule> <rule name="404 HTTPS"> <match url="(.*)" /> <conditions> <add input="{REQUEST_URI}" pattern="CFFileServlet/(.*)" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> <add input="{SERVER_PORT_SECURE}" pattern="1" /> </conditions> <action type="Rewrite" url="/404.cfm?404;https://{HTTP_HOST}:{SERVER_PORT}{REQUEST_URI}" /> </rule> </rules> </rewrite> </system.webServer> </configuration>

El archivo de configuración anterior tiene en cuenta las solicitudes HTTP y HTTPS. También tendrá en cuenta el directorio CFFileServlet, que ColdFusion utiliza para alojar imágenes y activos temporales. Si la URL comienza con este directorio, se pasará como una solicitud normal.

Gracias a todos por sus aportes.


Permítanme prólogo de mi respuesta al afirmar que todavía estoy ejecutando ColdFusion 9, por lo que no tengo experiencia de primera mano con el manejo de 404 en ColdFusion 10 con Tomcat. Obviamente tendré que actualizar a la versión 10, así que estoy tratando de familiarizarme con sus matices (como manejar los 404). Así que hice algunas búsquedas.

Como indicó en su pregunta, con ColdFusion 9 e IIS, el archivo originalmente solicitado se contiene normalmente con la variable CGI.QUERY_STRING precedida de "404;". Con ColdFusion 10 y Tomcat parece que algunas otras variables CGI contienen el archivo solicitado originalmente y depende de su configuración de qué variable se trata.

Encontré esta publicación de blog de Raymond Camden - Recordatorio - hay-más-que-el-CGI-alcance-que-qué-el-volcado-muestra . Si bien eso contiene buena información en sí misma, también encontré en los comentarios de Jules Gravinese lo siguiente:

Cuando se usa IIS7, la variable es CGI.HTTP_X_ORIGINAL_URL

Al usar ISAPI_rewrite, la variable es CGI.HTTP_X_REWRITE_URL

Al usar APACHE, la variable es CGI.REDIRECT_URL

También encontré algunos otros artículos que hacen referencia a una variable CGI.REDIRECT_QUERY_STRING que creo que también se incluye cuando se utiliza APACHE .

Se encontró otro artículo de Adobe sobre las variables CGI y cómo se usan con ColdFusion (y cómo / por qué no es una lista completa): variables de entorno CGI (Alcance CGI) .

NOTA: También encontré este error ColdFusion 10.0 - Error 3488063: las URL del controlador de error personalizado de IIS 404 que son archivos .cfm no devuelven sistemáticamente todo el documento que se ha cerrado, pero varios comentarios recientes sugieren que todavía es un problema. Así que ten cuidado de eso.


Use el método Application.cfc OnMissingTemplate para manejar una página de plantilla faltante.

En Application.cfc agregue esto

<cffunction name="onMissingTemplate"> <cfargument name="targetPage" type="string" required=true/> <!--- No standard error handling here so we need to try/catch ---> <cftry> <!--- Can''t do a redirect so we''ll do an "include" ---> <cfset missingPage=Arguments.targetPage> <cfinclude template="/errors/404.cfm"> <cfcatch> <!--- Let the standard missing file (404) process occur ---> <cfreturn false /> </cfcatch> </cftry> </cffunction>

En /errors/404.cfm agrega esto cerca de la parte superior

<cfparam name="missingPage" type="string" default=""> <cfif missingPage eq ""> <!--- Include CGI variable and process as fitting for your purposes ---> <cfset missingPage=CGI.QUERY_STRING> </cfif>


NOTA: La pregunta anterior también incluye una solución.

Creo que esto es un error con Coldfusion Connector. Publicaba un informe de error en Adobe ( https://bugbase.adobe.com/ ). Aunque tengo una solución. Tengo el mismo problema, pero uso IIRF (Ionic IIS Redirector - http://iirf.codeplex.com/ ), y encontré una forma de usar eso para evitar el error por ahora:

  1. Elimine cualquier configuración de archivo 404 anterior en IIS / Coldfusion
  2. Instale IIRF normalmente, de acuerdo con sus instrucciones de instalación.
  3. En el archivo IirfGlobal.ini (normalmente ubicado en C: / Windows / System32 / inetsrv / IIRF), agregue la siguiente línea:

    RewriteFilterPriority HIGH

    Esto permitirá que IIRF maneje solicitudes 404 antes de que llegue a ColdFusion / Tomcat.

  4. En el archivo Iirf.ini específico del sitio (normalmente crea uno en la carpeta raíz de sus archivos web, consulte los documentos de IIRF para obtener más información), agregue las siguientes reglas:

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

    Eso redireccionará todos los archivos / directorios que no existen a page_to_redirect_to.cfm, y agregará la cadena de consulta 404 como normal.

  5. EDITAR: Agregó un siguiente paso: Vaya al Administrador de IIS y seleccione el servidor o el Sitio web que se configuró para usar IIRF, luego vaya a la sección Filtros de ISAPI. Haga clic en "Ver lista ordenada", luego mueva el filtro IIRF hasta la parte superior.

EDIT 2: Acabo de publicar un error en Adobe. Ver https://bugbase.adobe.com/index.cfm?event=bug&id=3630245

Espero que ayude.