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页(在服务器上执行)
<?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”