当前位置: 首页 > 知识库问答 >
问题:

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

傅志诚
2023-03-14

我们有如下服务器设置:

  • Windows 2012 R2

自定义404页面(CFM文件)处理丢失的URL,并根据数据库中的自定义URL检查它们。如果找到匹配,它将显示相关数据。例如,当自定义URL映射到不存在的CFM文件时,就会出现问题。

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

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

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

在Tomcat为所述页面返回404错误后,是否有任何方法来保留最初请求的URL(CFM文件)?

解决方案,我自己组装的,灵感来自托马斯·高格利翁

正如所怀疑的那样,问题总是归结为请求被转发到ISAPI_REDIRECT模块,即使所涉文件不存在。

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

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

看看我的网页。下面提供解决方案的配置条目。

<?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以该目录开头,它将作为正常请求传递。

谢谢大家的意见。

共有3个答案

韩玉石
2023-03-14

使用Application.cfcOnMisSingTemboard方法来处理丢失的模板页。

正在申请中。加上这个

<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>
黄景胜
2023-03-14

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

正如您在问题中所述,对于ColdFusion 9和IIS,最初请求的文件通常包含有CGI。QUERY_STRING变量前缀为"404;"。对于ColdFusion 10和Tomcat,看起来好像其他CGI变量包含了最初请求的文件,这取决于您的设置是哪个变量。

我找到了雷蒙德·卡姆登的这篇博文——提醒——CGI的范围比垃圾堆显示的要多。虽然这本身包含了很好的信息,但我在Jules Gravinese的评论中也发现了以下内容:

当使用IIS7时,变量是CGI。HTTP_X_ORIGINAL_URL

使用ISAPI_rewrite时,变量为CGI。HTTP_X_REWRITE_URL

使用APACHE时变量为CGI。REDIRECT_URL

我还发现了其他一些引用CGI的文章。REDIRECT_QUERY_STRING变量,我相信在使用APACHE时也会包含该变量。

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

注意:我还发现了这个错误ColdFusion 10.0-错误3488063:IIS 404自定义错误处理程序URL。cfm文件并不总是返回已关闭的整个文档,但最近的几条评论表明,这仍然是一个问题。所以要意识到这一点。

井洲
2023-03-14

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

我认为这是Coldfusion连接器的错误。我会向Adobe发布一份错误报告(https://bugbase.adobe.com/).不过我确实有解决办法。我也有同样的问题,但我使用IIRF(离子IIS重定向器-http://iirf.codeplex.com/),我找到了一种方法来避免这个错误:

>

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]

这会将所有不存在的文件/目录重定向到页面。cfm,并像普通一样添加404查询字符串

编辑:添加以下步骤:进入IIS管理器,选择配置为使用IIRF的服务器或网站,然后进入ISAPI筛选器部分。单击“查看有序列表”,然后将IIRF筛选器移到顶部。

编辑2:刚刚在Adobe上发布了一个bug。见https://bugbase.adobe.com/index.cfm?event=bug

希望有帮助。

 类似资料:
  • 一个简单的网页请求总是报错:favicon.ico文件不存在。 我在apache的根目录中放置了一个图片文件 favicon.ico,故障消失。 我找了一些资料: 因为现在的浏览器都或第三方程序都会默认请求favicon.ico图标,如果没有就会报404错误。 请问,为何浏览器或第三方要请求这个东东?不请求不行吗?

  • 问题内容: 我有一个字符串值保存到变量中,我的网页在经过一定的处理后会自动重新加载。.我需要知道即使刷新页面后也能获取存储在该变量中的值吗? 我使用JavaScript代码刷新网页 如果不是这样的话,如果我使用类似php的服务器端脚本,是否可以使用? 问题答案: JavaScript: 1)(仅适用于HTMl5浏览器)-您可以将其另存为页面的本地存储配额的属性 2)将其保存在Cookie中 3)将

  • 问题内容: 我有一个使用Python编写的守护程序。运行时,它的PID文件位于/tmp/filename.pid。如果守护程序未运行,则PID文件不存在。 在Linux上,如何检查以确保PID文件存在,如果不存在,请执行命令将其重新启动? 该命令将是 必须从特定目录执行。 问题答案: 检查给定路径是否存在并且是常规文件(仅检查路径是否存在) 在执行测试并返回成功,否则 的是C状,因此,如果左侧的命

  • 我正在使用Spring Security和前端reactJS的Spring Boot构建一个应用程序。我的代码可以很好地进行身份验证。但现在我计划将用户重定向到他以前请求的页面,以防他再次登录。 我可以从成功处理程序中提取 targetUrl,即上一页,但是当我在 UI 上执行控制台.log(数据)时。我得到的是原始的html数据而不是URL名称。我不知道为什么以及如何打开这样的原始 html 代

  • 问题内容: 我需要检查远程服务器上是否存在特定文件。使用和不起作用。有什么想法如何快速轻松地做到这一点? 问题答案: 您必须使用CURL

  • 我得到下面的错误,而试图执行我的selenium代码如下所示: 错误-异常在线程"main"java.lang.IllegalStateExcture:驱动程序可执行文件不存在:C:\Selenium\简介\C:\chromeDriverScom.google.common.base.Preconditions.check状态(Preconditions.java:585)在org.openqa.