2013-03-25 34 views
3

我从Stackoverflow->博客重新处理Sitecore中的自定义404(它实际上做302重定向到状态200的404页面,它被google作为软404获取) 。生产中的Sitecore自定义404处理程序

虽然这在我们的本地测试服务器中完全正常,但当我们在生产中丢弃该网站时,网站出现故障并需要AGES 8-9分钟加载和东西。

public class ExecuteRequest : Sitecore.Pipelines.HttpRequest.ExecuteRequest 
{ 
    protected override void RedirectOnItemNotFound(string url) 
    { 
     var context = System.Web.HttpContext.Current; 

     try 
     { 
      // Request the NotFound page 
      var domain = context.Request.Url.GetComponents(
       UriComponents.Scheme | UriComponents.Host, 
       UriFormat.Unescaped); 

      var content = WebUtil.ExecuteWebPage(
       string.Concat(domain, url)); 

      // The line below is required for IIS 7.5 hosted 
      // sites or else IIS is gonna display default 404 page 
      context.Response.TrySkipIisCustomErrors = true; 
      context.Response.StatusCode = 404; 
      context.Response.Write(content); 
     } 
     catch (Exception ex) 
     { 
      Log.Error(string.Format("Falling back to default redirection behavior. Reason for error {0}", ex), ex); 

      // Fall back to default behavior on exceptions 
      base.RedirectOnItemNotFound(url); 
     } 

     context.Response.End(); 
    } 
} 

P.S:然后我在web.config中用我自定义的一个替换了ExecuteRequest。

如果您遇到类似的事情或知道任何问题,请务必澄清一些情况。

在此先感谢

+0

我曾想过对WebUtil.ExecuteWebPage的调用在任何其他轻量级流量中都会产生问题。太多的循环Web请求触发。如果你的404页面以某种方式调用404本身,你可能会进入循环(也许这是发生了什么?) – 2013-04-18 08:53:31

回答

6

有在Sitecore的设置,使用它可以摆脱302重定向:

<setting name="RequestErrors.UseServerSideRedirect" value="true" /> 

通过这种设置,网址保持不变和状态代码为404.如果您想要一些额外的逻辑(如将Sitecore项目显示为错误页面),Sitecore Market Place上有一个名为Error Manager的共享源模块。

希望有所帮助。

+0

只要你的404页面是一个文件,而不是一个Sitecore项目,这个工作。 – 2013-04-15 13:39:40

+0

Sitecore错误管理器处理404文件,该文件呈现Sitecore项目。通过这种方式,您可以将项目作为404页面并使用上述设置来摆脱302。 – 2013-04-16 12:14:13

0

检查服务器是否能够访问您的网站的主机名。

服务器通常无法访问DNS,因此无法解析主机名。为了使404处理程序能够工作,应用程序需要能够访问自己的主机名来请求404页面。

可以肯定这部作品,编辑hosts文件服务器并添加你的主机名的条目存在,它指向到127.0.0.1

0

您可以创建新的解析器解析它。当您想以正确的语言向用户提供错误页面时,这是一个很好的解决方案。但是在IIS 7.0和7.5中存在一些差异。

加处理器到您Sitecore的配置:

<processor type="Sitecore.Pipelines.HttpRequest.ItemResolver, Sitecore.Kernel"/> 
<processor type="Project.Error404Resolver, Project" /> 

处理器解决它:

对于IIS 7.0:

public class Error404Resolver : Sitecore.Pipelines.HttpRequest.HttpRequestProcessor 
{ 
    public override void Process(Sitecore.Pipelines.HttpRequest.HttpRequestArgs args) 
    { 
     if(Sitecore.Context.Item == null && !args.Context.Request.Url.AbsolutePath.StartsWith("/sitecore") 
     { 
      args.Context.Response.Clear(); 

      SiteContext site = Sitecore.Context.Site; 
      if(site != null) 
      { 
       Item item404Page = Sitecore.Context.Database.GetItem(site.RootPath + "website/error/404"); 
       if(item404Page != null) 
       { 
        Sitecore.Context.Item = item404Page; 
        args.Context.Response.StatusCode = (int) System.Net.HttpStatusCode.NotFound; 
       } 
      } 
     } 
    } 
} 

对于IIS 7.5:

public class Error404Resolver : Sitecore.Pipelines.HttpRequest.HttpRequestProcessor 
{ 
    public override void Process(Sitecore.Pipelines.HttpRequest.HttpRequestArgs args) 
    { 
     if(Sitecore.Context.Item == null && !args.Context.Request.Url.AbsolutePath.StartsWith("/sitecore") 
     { 
      args.Context.Response.Clear(); 

      SiteContext site = Sitecore.Context.Site; 
      if(site != null) 
      { 
       Item item404Page = Sitecore.Context.Database.GetItem(site.RootPath + "website/error/404"); 
       if(item404Page != null) 
       { 
        WebClient webClient = new WebClient(); 
        webClient.Encoding = args.Context.Request.ContentEncoding; 
        webClient.Headers.Add("User-Agent", args.Context.Request.UserAgent); 
        string page = webClient.DownloadString(LinkManager.GetItemUrl(item404Page)); 

        args.Context.Response.StatusCode = (int) System.Net.HttpStatusCode.NotFound; 
        args.Context.Response.Write(page); 
        args.Context.Response.TrySkipIisCustomErrors = true; 
        args.Context.Response.End(); 
       } 
      } 
     } 
    } 
} 

白衣这个你呈现在当前页面错误页面重定向没有返回到浏览器代码404

0

我在一个客户我目前的工作同样的问题(貌似代码粘贴),实际上原因很明显:如果使用未在Sitecore站点配置中注册的url执行此调用(但可通过IIS访问),则还将运行此代码。不幸的是,WebUtil.ExecuteWebPage调用也是使用错误的url执行的,因此最终会陷入循环。

实际上,您应该会在您的日志中看到很多这些消息:回退到默认重定向行为。错误原因{0},可能是超时。

如果您确实想使用您的自定义处理程序,则应在调用WebUtil.ExecuteWebPage之前检查您是否位于正确的站点上下文中。