2013-03-25 61 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之前檢查您是否位於正確的站點上下文中。