来自项目的 Sitecore 404 页面

Sitecore 404 page from item

Getting Sitecore to respond with a 404 error code, 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);

这个解决方案对我来说效果不佳,因为 cookies/security 当服务器发出第二次请求以获取 404 内容时 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 支持说 OS 应该无关紧要,它适用于 Win2008 服务器,但我已经尝试了 4 台独立的 Win2008 机器,我已经尝试了 Sitecore 7.2 版本的普通安装。 141226 并且每次都会显示默认的 IIS 404 错误。

有什么想法吗?谢谢

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

context.Response.TrySkipIisCustomErrors = true;