来自内容树的sitecore中的自定义404页面

时间:2014-01-16 22:01:42

标签: sitecore multilingual

我有多语言网站,我希望所有语言的自定义404页面取决于网站的上下文。获取内容树中定义的404页面或从内容树访问404页面的正确方法是什么?如果我将在我的站点根目录中定义,而不是从内容树中定义,那么我可以获得404页面。

enter image description here

我希望内容树中的404页面作为我的404自定义重定向。

我的Webconfig设置:

<setting name="ItemNotFoundUrl" value="/404Page.aspx" />

IIS 404条目。 enter image description here

当sitecore中没有页面时我得到的错误:

将IIS更改为默认值并设置httpErrors之后      

  <error statusCode="404" path="/404PAGE.aspx" responseMode="ExecuteURL" />

</httpErrors>

enter image description here

4 个答案:

答案 0 :(得分:6)

Sitecore做了一些自己的“未找到项目”处理,也没有很好地以SEO友好的方式处理404s。

我发现在Sitecore中处理404s和其他错误的最佳解决方案是Sitecore错误管理器。

http://marketplace.sitecore.net/en/Modules/Sitecore_Error_Manager.aspx

https://github.com/unic/SitecoreErrorManager/wiki

答案 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之后添加处理器。
  • 查找上下文项是否为null,如果null将404内容页设置为上下文项。
  • httpRequestEnd处理器之后的管道EndDiagnostics中添加另一个处理器,为未找到的项目设置404状态代码。

使用这种方法,我们不需要在Renderings上设置404状态代码。因为我们在“httpRequestEnd”管道的末尾设置它。 / 404页面返回200状态代码,因为此页面假设返回200状态代码。

适用于多站点/多语言环境。