Tomcat ColdFusion 10+;IIS:CFM文件的不存在URL。执行404页面后检索原始URL

Tomcat ColdFusion 10+;IIS:CFM文件的不存在URL。执行404页面后检索原始URL,tomcat,iis,coldfusion,Tomcat,Iis,Coldfusion,我们的服务器设置如下: Windows 2012 R2 Coldfusion 10,企业号 IIS,配置自定义404页(在服务器上执行) 自定义404页面(CFM文件)处理丢失的URL,并根据数据库中的自定义URL检查它们。如果找到匹配项,它将显示相关数据。当自定义URL映射到不存在的CFM文件时会出现问题;比如说 /home/map.cfm(不是真正的文件或目录) 现在,当用户请求此URL时,服务器会看到它是一个CFM文件,并正确地将其传递给ColdFusion(通过ISAPI重定向)。T

我们的服务器设置如下:

  • Windows 2012 R2
  • Coldfusion 10,企业号
  • IIS,配置自定义404页(在服务器上执行)
自定义404页面(CFM文件)处理丢失的URL,并根据数据库中的自定义URL检查它们。如果找到匹配项,它将显示相关数据。当自定义URL映射到不存在的CFM文件时会出现问题;比如说

/home/map.cfm(不是真正的文件或目录)

现在,当用户请求此URL时,服务器会看到它是一个CFM文件,并正确地将其传递给ColdFusion(通过ISAPI重定向)。Tomcat发现该文件实际上并不存在,并返回404。IIS看到此404消息并执行自定义错误页(/errors/404.cfm)

结果CGI变量实际上不允许我们检索原始URL(将其映射到数据库中的虚拟URL),通常作为CGI.QUERY\u字符串变量的一部分提供。相反,QUERY_STRING变量包含“jakarta”目录中“isapi_rewrite.dll”文件的路径

在Tomcat为所述页面返回404错误后,有没有办法保留最初请求的URL(CFM文件的)

由Thomas Gorgolione启发,由我自己设计的解决方案

正如所怀疑的那样,问题总是归结为转发到ISAPI_重定向模块的请求,即使所讨论的文件不存在

正如Thomas所建议的,一个优雅的解决方案是利用重写来检查文件/目录是否确实存在,然后再将其传递给ISAPI_重定向模块

虽然Thomas建议的软件可以实现这一目的,但我无法将其安装在64位Windows 2012 R2机器上。然而,我已经设法回过头来利用IIS8(可能还有更早的版本)中包含的URL重写模块

请参阅下面提供解决方案的my web.config条目

<?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>

上述配置文件同时考虑HTTP和HTTPS请求。它还将考虑CFFileServlet目录,ColdFusion使用该目录托管临时映像和资产。如果URL以该目录开头,它将作为普通请求传递

谢谢大家的输入。

使用来处理缺少的模板页面

在Application.cfc中添加以下内容

<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>

在/errors/404.cfm中,在顶部附近添加此选项

<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>

让我在回答之前先说一下,我仍然在运行ColdFusion 9,因此我没有使用Tomcat在ColdFusion 10中处理404的第一手经验。显然,我需要升级到版本10,所以我正在尝试熟悉它的细微差别(比如处理404)。所以我做了一些搜索

正如您在问题中所述,对于ColdFusion 9和IIS,最初请求的文件通常包含在
CGI.QUERY\u字符串中,该字符串的前缀为“404;”。使用ColdFusion 10和Tomcat时,看起来好像其他一些
CGI
变量包含最初请求的文件,这取决于您的设置是哪个变量

我找到了雷蒙德·卡姆登的这篇博文-。虽然它本身包含了很好的信息,但我在下面的评论中也找到了:

使用IIS7时,变量为
CGI.HTTP\u X\u ORIGINAL\u URL

使用ISAPI\u rewrite时,变量为
CGI.HTTP\u X\u rewrite\u URL

使用APACHE时,变量为
CGI.REDIRECT\u URL

我还发现其他一些文章引用了
CGI.REDIRECT\u QUERY\u STRING
变量,我相信在使用APACHE时也会包含该变量


找到Adobe的另一篇关于CGI变量以及它们如何与ColdFusion一起使用的文章(以及如何/为什么它不是一个完整的列表):



注意:我也发现了这个已经关闭的bug,但是最近的一些评论表明它仍然是一个问题。所以要注意这一点。

注意:上面的问题也包括一个解决方案。

我认为这是Coldfusion连接器的错误。我会将一个bug报告发布到Adobe()。不过我确实有一个解决办法。我也有同样的问题,但我使用IIRF(Ionic IIS Redirector-),我找到了一种方法来使用它来避免目前的错误:

  • 删除IIS/Coldfusion中以前的任何404文件配置
  • 根据IIRF的安装说明,正常安装IIRF
  • 在IirfGlobal.ini文件(通常位于C:\Windows\System32\inetsrv\IIRF)中,添加以下行:

    RewriteFilterPriority HIGH
    
    这将允许IIRF在命中ColdFusion/Tomcat之前处理404个请求

  • 在特定于站点的Iirf.ini中(通常在web文件的根文件夹中创建一个——有关详细信息,请参阅Iirf文档),添加以下规则:

    RewriteCond %{SCRIPT_TRANSLATED} !-f
    RewriteCond %{SCRIPT_TRANSLATED} !-d
    RewriteRule ^(.+)$ page_to_redirect_to.cfm?404;$1 [L]
    
    这将把所有不存在的文件/目录重定向到page_to_redirect_to.cfm,并像正常情况一样添加404查询字符串

  • 编辑:添加了以下步骤:进入IIS管理器,选择配置为使用IIRF的服务器或网站,然后进入ISAPI过滤器部分。点击“Vi”