我有多语言网站,我希望所有语言的自定义404页面取决于网站的上下文。获取内容树中定义的404页面或从内容树访问404页面的正确方法是什么?如果我将在我的站点根目录中定义,而不是从内容树中定义,那么我可以获得404页面。
我希望内容树中的404页面作为我的404自定义重定向。
我的Webconfig设置:
<setting name="ItemNotFoundUrl" value="/404Page.aspx" />
IIS 404条目。
当sitecore中没有页面时我得到的错误:
将IIS更改为默认值并设置httpErrors之后
<error statusCode="404" path="/404PAGE.aspx" responseMode="ExecuteURL" />
</httpErrors>
答案 0 :(得分:6)
Sitecore做了一些自己的“未找到项目”处理,也没有很好地以SEO友好的方式处理404s。
我发现在Sitecore中处理404s和其他错误的最佳解决方案是Sitecore错误管理器。
http://marketplace.sitecore.net/en/Modules/Sitecore_Error_Manager.aspx
答案 1 :(得分:6)
您可以将Sitecore配置中的ItemNotFoundUrl
设置为内容树中的任何项目,它不需要位于站点根目录中,只要您不指定语言,它就会使用任何用户一直在浏览网站(或首次访问默认)。该项目必须与所有网站的树结构相同:
<setting name="ItemNotFoundUrl" value="/errors/404.aspx" />
<setting name="LayoutNotFoundUrl" value="/errors/500.aspx"/>
<setting name="NoAccessUrl" value="/errors/403.aspx"/>
Techphoria414是正确的,Sitecore开箱即用并不擅长以SEO友好的方式处理404,它将执行302重定向到错误页面。但是,如果将以下内容设置为true
,则将使用Server.Transfer:
<!-- USE SERVER-SIDE REDIRECT FOR REQUEST ERRORS
If true, Sitecore will use Server.Transfer instead of Response.Redirect to redirect request to service pages when an error occurs (item not , access denied etc).
Default value: false
-->
<setting name="RequestErrors.UseServerSideRedirect" value="true"/>
在ExecuteRequest
管道中触发以下代码。
protected virtual void PerformRedirect(string url)
{
if (Settings.RequestErrors.UseServerSideRedirect)
HttpContext.Current.Server.Transfer(url);
else
WebUtil.Redirect(url, false);
}
您可以在此blog post中详细了解相关内容。确保在处理它的代码中将当前System.Web.HttpResponse的Status属性设置为404。 Handling HTTP 404文档中有更多信息。
错误管理器是一个很棒的模块,如果你需要为不同的站点设置不同的URL位置,它会更加灵活。
答案 2 :(得分:6)
我在ExecuteRequest
管道中使用httpBeginRequest
处理器的自定义实现
这就是最终处理404请求的地方。
您可以覆盖其中的RedirectOnItemNotFound
方法并添加一些逻辑,以便为每个网站加载不同的404页面。
查看解释如何实施它的this blog post。
编辑:我添加了一个如何实现它的示例,以便您可以返回特定于网站的404页面。
如果您进行此修改,则可以为每个站点返回不同的404页面:
将其添加到配置中:
<setting name="NotFoundPage.SiteName1" value="/not-found.aspx" />
<setting name="NotFoundPage.SiteName2" value="/not-found.aspx" />
然后在自定义RedirectOnItemNotFound代码中,执行此操作以返回特定于站点的404内容:
public class ExecuteRequest : Sitecore.Pipelines.HttpRequest.ExecuteRequest
{
protected override void RedirectOnItemNotFound(string url)
{
var context = System.Web.HttpContext.Current;
try
{
// Get the domain of the current request.
string domain = context.Request.Url.GetComponents(UriComponents.Scheme | UriComponents.Host, UriFormat.Unescaped);
// Get 'not found page' setting for current site.
string notFoundUrl = Sitecore.Configuration.Settings.GetSetting(string.Conact("NotFoundPage.", Sitecore.Context.Site.Name));
// Request the contents of the 'not found' page using a web request.
string content = Sitecore.Web.WebUtil.ExecuteWebPage(string.Concat(domain, notFoundUrl));
// Send the content to the client with a 404 status code
context.Response.TrySkipIisCustomErrors = true;
context.Response.StatusCode = 404;
context.Response.Write(content);
}
catch (Exception)
{
// If our plan fails for any reason, fall back to the base method
base.RedirectOnItemNotFound(url);
}
// Must be outside the try/catch, cause Response.End() throws an exception
context.Response.End();
}
}
您的想法是使用网站名称作为设置密钥,以便您可以解析每个网站的配置值 代码当然需要一些工作,但你明白了......
编辑2:添加了使用新管道处理器替换原始管道处理器的示例配置:
<pipelines>
<httpRequestBegin>
<processor type="Sitecore.Pipelines.HttpRequest.ExecuteRequest, Sitecore.Kernel">
<patch:attribute name="type">ParTech.Pipelines.ExecuteRequest, ParTech</patch:attribute>
</processor>
</httpRequestBegin>
</pipelines>
答案 3 :(得分:0)
我写了一篇关于此的博文,可能对将来有用。
http://sitecoreblog.tools4geeks.com/Blog/35/Better-way-of-handling-sitecore-404-pages
我采取的方法是:
HttpRequest.ItemResolver
管道上HttpRequestBegin
之后添加处理器。httpRequestEnd
处理器之后的管道EndDiagnostics
中添加另一个处理器,为未找到的项目设置404状态代码。使用这种方法,我们不需要在Renderings上设置404状态代码。因为我们在“httpRequestEnd”管道的末尾设置它。 / 404页面返回200状态代码,因为此页面假设返回200状态代码。
适用于多站点/多语言环境。