来自item的Sitecore 404页面

时间:2015-02-26 16:50:49

标签: sitecore sitecore7 sitecore7.2

让Sitecore回复404错误代码,this blog似乎是引用最多的,其中处理器添加到httpRequestBegin管道,StatusCode设置为404响应是从单独请求的结果中写出的。像这样:

// Request the NotFound page
string domain = context.Request.Url.GetComponents(UriComponents.Scheme | UriComponents.Host, UriFormat.Unescaped);
string content = Sitecore.Web.WebUtil.ExecuteWebPage(string.Concat(domain, url));

// Send the NotFound page content to the client with a 404 status code
context.Response.TrySkipIisCustomErrors = true;
context.Response.StatusCode = 404;
context.Response.Write(content);

此解决方案对我来说效果不佳,因为当服务器发出第二个获取404内容的请求时,cookie /安全性和IP检测会丢失。

经过Sitecore的支持,我们想出了这段代码(只是一个简单的样本):

public class MyHttpBeginRequestProcessor : Sitecore.Pipelines.HttpRequest.HttpRequestProcessor
{
    public override void Process(Sitecore.Pipelines.HttpRequest.HttpRequestArgs args)
    {
        if (Sitecore.Context.Item != null
        || Sitecore.Context.Site == null
        || Sitecore.Context.Database == null)
        {
            return;
        }
        Sitecore.Data.Database master = Sitecore.Configuration.Factory.GetDatabase("master");
        Sitecore.Context.Item = master.GetItem("/sitecore/content/home");
        Sitecore.Context.Items["Set404"] = "true";
    }
}
public class MyHttpEndRequestProcessor : Sitecore.Pipelines.HttpRequest.HttpRequestProcessor
{
    public override void Process(Sitecore.Pipelines.HttpRequest.HttpRequestArgs args)
    {
        if (Sitecore.Context.Items.Contains("Set404"))
        {
            args.Context.Response.StatusCode = 404;
        }
    }
}

然后你在httpRequestEnd管道和httpRequestBegin管道中添加了一个新处理器,如下所示:

<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
  <sitecore database="SqlServer">
    <pipelines>
      <httpRequestBegin>
        <processor type="NewInstance3.Pipelines.MyHttpBeginRequestProcessor, NewInstance3" patch:after="processor[@type='Sitecore.Pipelines.HttpRequest.ItemResolver, Sitecore.Kernel']"/>
      </httpRequestBegin>
      <httpRequestEnd>
        <processor type="NewInstance3.Pipelines.MyHttpEndRequestProcessor, NewInstance3"/>
      </httpRequestEnd>
    </pipelines>
  </sitecore>
</configuration>

这完全适用于我的本地工作站(Win7 x64);但是,当我将该站点复制到Win2008 x64服​​务器时,将显示默认的IIS 404错误页面。在httpRequestEnd管道上将StatusCode设置为404会导致IIS显示其404错误,而不是我在httpRequestBegin管道中设置的Sitecore项。

Sitecore支持说操作系统无关紧要,它适用于Win2008服务器,但我尝试了4台独立的Win2008机器,我尝试过Sitecore 7.2 rev的vanilla安装。 141226并且每次都显示默认的IIS 404错误。

有什么想法吗?感谢

1 个答案:

答案 0 :(得分:3)

将以下内容添加到您的代码中:

context.Response.TrySkipIisCustomErrors = true;
相关问题