来自项目的 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;
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;