如何使用Mura和您的Web服务器处理404错误?

时间:2015-08-19 19:23:56

标签: iis coldfusion coldfusion-11 mura

我已经找到了答案,但我找不到确切的信息来源。我所追求的是能够记录/通知每个 404错误。我在网上找到的信息解决了一些 404错误,但并非全部。我做了一些测试,下面是测试的结果。您如何处理Mura网站的404错误?

我正在使用IIS和Adobe ColdFusion以及Mura 6.2.6338 我创建了自己的onSite404功能来捕捉Mura中的那个事件 我创建了自己的ColdFusion页面来捕获IIS何时触发它的404处理程序。

根据我的测试,似乎有一些内置的Mura功能可以从Web根目录处理404。它们似乎不遵循标准的404执行模式。不确定我在任何地方都看到过记录吗?

在我的一些测试中,我收到了几个超时错误。不知道为什么。可能在我尝试从我的自定义IIS 404页面调用正常的Mura处理的方式。

基本上我想要的是让所有IIS 404错误调用我自己的自定义ColdFusion页面,我可以在其中记录/通知错误,然后显示正常的Mura 404页面(不使用重定向,因为这会取消404状态代码给用户)。

以下是我测试的结果:

仅定义了Mura 404页面:

Requested URL                           onSite404  IIS 404  Displayed
                                         called     called
/filedoesnotexist.cfm                       No       n/a    shows home page
/filedoesnotexist.htm                       No       n/a    shows home page
/filedoesnotexist.asp                       No       n/a    shows iis 404 error
/folderdoesnotexist/                        Yes      n/a    shows iis 404 error AND mura 404 page
/folderdoesnotexist/filedoesnotexist.cfm    Yes      n/a    shows iis 404 error AND mura 404 page
/folderdoesnotexist/filedoesnotexist.htm    Yes      n/a    shows iis 404 error AND mura 404 page
/folderdoesnotexist/filedoesnotexist.asp    No       n/a    shows iis 404 error

定义了Mura 404页面并且IIS 404指向同一个Mura 404页面/index.cfm/404/

Requested URL                           onSite404  IIS 404  Displayed
                                         called     called
/filedoesnotexist.cfm                       No     Unknown  shows home page
/filedoesnotexist.htm                       No     Unknown  shows home page
/filedoesnotexist.asp                       No     Unknown  shows mura 404 page
/folderdoesnotexist/                        Yes    Unknown  shows mura 404 page
/folderdoesnotexist/filedoesnotexist.cfm    Yes    Unknown  shows mura 404 page
/folderdoesnotexist/filedoesnotexist.htm    Yes    Unknown  shows mura 404 page
/folderdoesnotexist/filedoesnotexist.asp    No     Unknown  shows mura 404 page

定义了Mura 404页面,IIS 404指向它自己的404页面/iis404.cfm

Requested URL                           onSite404  IIS 404  Displayed
                                         called     called
/filedoesnotexist.cfm                       No       No     shows home page
/filedoesnotexist.htm                       No       No     shows home page
/filedoesnotexist.asp                       No       Yes    shows custom iis 404 page
/folderdoesnotexist/                        Yes      Yes    shows custom iis 404 page
/folderdoesnotexist/filedoesnotexist.cfm    Yes      Yes    shows custom iis 404 page
/folderdoesnotexist/filedoesnotexist.htm    Yes      Yes    shows custom iis 404 page
/folderdoesnotexist/filedoesnotexist.asp    No       Yes    shows custom iis 404 page

定义了Mura 404页面,IIS 404在Web根目录中指向它自己的404页面/iis404.cfm,该页面通过application.contentServer.handleRootRequest()调用Mura处理:

Requested URL                           onSite404  IIS 404  Displayed
                                         called     called
/filedoesnotexist.cfm                       No       No     shows home page
/filedoesnotexist.htm                       No       No     500 Internal server error – coldfusion.runtime.RequestTimedOutException on query
/filedoesnotexist.asp                       No       Yes    shows home page
/folderdoesnotexist/                        Yes      Yes    shows home page
/folderdoesnotexist/filedoesnotexist.cfm    Yes      Yes    shows home page
/folderdoesnotexist/filedoesnotexist.htm    Yes      Yes    shows CF sitewide error page - coldfusion.runtime.RequestTimedOutException on query
/folderdoesnotexist/filedoesnotexist.asp    No       Yes    shows home page

定义了Mura 404页面,并且IIS 404在站点ID根目录中指向它自己的404页面/siteid/iis404.cfm,该页面通过application.contentServer.parseURLLocal()调用Mura处理:

Requested URL                           onSite404  IIS 404  Displayed
                                         called     called
/filedoesnotexist.cfm                       No       No     shows home page
/filedoesnotexist.htm                       No       No     500 Internal server error – coldfusion.runtime.RequestTimedOutException on query
/filedoesnotexist.asp                       No       Yes    shows home page
/folderdoesnotexist/                        Yes      Yes    shows home page
/folderdoesnotexist/filedoesnotexist.cfm    Yes      Yes    shows home page
/folderdoesnotexist/filedoesnotexist.htm    Yes      Yes    shows CF sitewide error page - coldfusion.runtime.RequestTimedOutException on query
/folderdoesnotexist/filedoesnotexist.asp    No       Yes    shows home page

Mura似乎正在处理任何ColdFusion 404错误,除了在web根目录,我可以在onSite404方法中进行处理。但我无法弄清楚如何让其他404错误进行处理 AND 调用Mura 404页面向用户显示。

记录更多的调查结果。我在网上的一些博客文章中发现,对于IIS,您应该在配置的existingResponse部分下将PassThrough设置为httpErrors,它将解决一些404问题。这是我做出改变后的测试结果:

定义了Mura 404页面,IIS 404指向自己的404页面/iis404.cfm,IIS httpErrors设置为PassThrough existingResponse

Requested URL                           onSite404  IIS 404  Displayed
                                         called     called
/filedoesnotexist.cfm                       No       No     shows home page
/filedoesnotexist.htm                       No       No     shows CF sitewide error page - coldfusion.runtime.RequestTimedOutException on query
/filedoesnotexist.asp                       No       No     shows blank 404 page
/folderdoesnotexist/                        Yes      No     shows mura 404 page
/folderdoesnotexist/filedoesnotexist.cfm    Yes      No     shows mura 404 page
/folderdoesnotexist/filedoesnotexist.htm    Yes      No     shows mura 404 page
/folderdoesnotexist/filedoesnotexist.asp    No       No     shows blank 404 page

因此,使用此配置,似乎IIS 404实际上从未调用过我的ColdFusion模板。更糟糕的是,在某些请求中它只发送一个空白的404响应。我按照设计工作,因为PassThrough告诉它只是传递响应。

在@Grant回答之后记录另一个结果。我已经尝试过Mura的standard404Handler方法,但不想覆盖它的所有功能,因为说实话,我不确定它在做什么并且不想打破一些标准的Mura功能。此外,我看到在此方法中调用onSite404方法。因此,我认为覆盖standard404Handler方法的测试结果与使用'onSite404`方法时没有什么不同。我的测试结果支持。

定义了Mura 404页面,IIS 404指向它自己的404页面/iis404.cfm并覆盖Mura standard404Handler

Requested URL                           onSite404  IIS 404  standard404Handler  Displayed
                                         called     called    called
/filedoesnotexist.cfm                       No        No        No              shows home page
/filedoesnotexist.htm                       No        No        No              shows home page
/filedoesnotexist.asp                       No        Yes       No              shows custom iis 404 page  
/folderdoesnotexist/                        No        No        Yes             shows mura 404 page
/folderdoesnotexist/filedoesnotexist.cfm    No        No        Yes             shows mura 404 page
/folderdoesnotexist/filedoesnotexist.htm    No        No        Yes             shows mura 404 page  
/folderdoesnotexist/filedoesnotexist.asp    No        Yes       No              shows custom iis 404 page  

现在很明显我需要使用Mura onSite404方法和我的IIS配置中的某种自定义404处理程序。因此,如果我能找到一种显示Mura 404页面的方法,同时保留404状态代码,则在我的自定义404处理程序运行后将解决我的问题。

3 个答案:

答案 0 :(得分:2)

我认为或许挂钩标准404Handler()事件是最简单的解决方案。

有几种方法,但最简单的方法是在Mura中创建一个名为“404”的页面(你已经完成了),然后把它放在网站的/includes/eventHandler.cfc中:

function standard404Handler( $,event ) {
    /* writeDump("hi, I'm a Mura 404!"); abort; */
    /* --- do custom stuff like logging, etc. --- */
    location( $.createHREF( filename="404") );
}

(如果它放在老式cfc中,请确保上面包含在cfscript标签中)

这应该可以解决问题。请注意,通过调用此事件,您将覆盖Mura的标准404处理行为(毕竟,这是此事件背后的意图)。因此,您负责所有 Mura 404处理...因此在功能结束时重定向到404页面。您可以在此处查看Mura页面请求流的所有“处理程序”事件:

http://docs.getmura.com/v6/back-end/events/life-cycle-of-a-front-end-request/

答案 1 :(得分:0)

感谢您的回复。我多玩了一下,觉得我可能找到了解决方案。它需要进一步测试,但到目前为止一切都很好。请记住 - 我在此之后所记录的是记录和/或通知任何404错误,返回Mura 404页面内容并返回正确的404状态代码。

事实证明,Mura已经有一个非常可靠的解决方案来处理像/some_non_existent_folder/some_non_existent_file.cfm这样的ColdFusion 404错误。如果您创建了名为“404”的页面,则Mura将显示该页面并返回正确的404状态代码。

问题在于Mura不会,也不应该处理非{cfm}页面的错误,例如/some_non_existent_folder/some_non_existent_file.jpg。相反,这些由您的Web服务器处理(在我的情况下为IIS)。因此,我们需要定义一个自定义页面来处理这些IIS 404错误。这样我们就可以记录/通知并最终向用户显示404页面内容并返回正确的404状态代码。

首先,请允许我重申,我仍然没有针对网络根目录中的文件发生404错误的解决方案,例如/some_non_existent_file.cfm/some_non_existent_file.jpg。 Mura本身不显示定义的404页面。而是显示主页。我认为IIS URL重写规则正在捕获这些规则,然后才能进行任何错误处理。但我对此感到满意。

对于所有其他404错误,这就是我所做的。我在测试中发现,当我定义了onSite404方法并定义了自定义IIS 404处理程序时,两者都被解雇为ColdFusion丢失文件而只有非cfm文件的IIS处理程序。我不需要处理这两次,所以我删除了我定义的onSite404方法。这只留下指向我创建的ColdFusion页面的自定义IIS 404处理程序(在Mura之外)。

对我来说,最后一件事是找到一种方法来调用我们创建的Mura 404页面,但仍返回正确的404状态代码。这就是内置Mura处理的地方。正如我所提到的,Mura已经正确处理了丢失的.cfm文件。所以我挖了Mura代码,看看他们是如何调用404页面的,看看我是否可以复制它。这是我找到的代码,似乎对我有用。我把它放在IIS 404处理程序调用的自定义ColdFusion页面的末尾。

<cfinvoke component="/requirements/mura/content/contentServer" method="render404" />

render404的{​​{1}}方法似乎完美地显示了Mura 404页面内容,并仍然返回正确的404状态代码。

如果有人知道以这种方式调用此方法的任何问题,请告诉我。

答案 2 :(得分:0)

我想指出的一件事是,默认情况下,Mura不会在丢失的.cfm文件上抛出404。这是预期的行为,以便您可以将现有应用程序与Mura集成。如果您希望覆盖此行为,可以使用以下方法:

<cfscript>
  // drop this into your SITE or THEME eventHandler.cfc to trigger a 404 on missing .cfm files
  public any function onSiteRequestStart($) {
    request.uri = GetPageContext().GetRequest().GetRequestURI();
    request.template = Right(request.uri, 1) != '/' ? ListLast(request.uri, '/') : '';
    if ( Len(request.template) && !FileExists(ExpandPath(request.template)) ) {
      request.currentfilenameadjusted = request.template;
    }
  }
</cfscript>