3

我从 Stackoverflow-> 一个重新处理 Sitecore 中的自定义 404 的博客中获取了以下代码(它实际上将 302 重定向到状态为 200 的 404 页面,谷歌将其作为软 404 获取)。

虽然这在我们的本地测试服务器上工作得很好,但当我们将它投入生产时,网站就会出现问题,并且需要 AGES 时间,例如 8-9 分钟来加载和填充。

public class ExecuteRequest : Sitecore.Pipelines.HttpRequest.ExecuteRequest
{
    protected override void RedirectOnItemNotFound(string url)
    {
        var context = System.Web.HttpContext.Current;

        try
        {
            // Request the NotFound page
            var domain = context.Request.Url.GetComponents(
                UriComponents.Scheme | UriComponents.Host, 
                UriFormat.Unescaped);

            var content = WebUtil.ExecuteWebPage(
                string.Concat(domain, url));

            // The line below is required for IIS 7.5 hosted 
            // sites or else IIS is gonna display default 404 page
            context.Response.TrySkipIisCustomErrors = true;
            context.Response.StatusCode = 404;
            context.Response.Write(content);
        }
        catch (Exception ex)
        {
            Log.Error(string.Format("Falling back to default redirection behavior. Reason for error {0}", ex), ex);

            // Fall back to default behavior on exceptions
            base.RedirectOnItemNotFound(url);
        }

        context.Response.End();
    }
} 

PS:然后我在 web.config 中用我的自定义替换了 ExecuteRequest。

如果您经历过类似的事情或知道任何问题,请务必说明一下。

提前致谢

4

4 回答 4

6

在 Sitecore 中有一个设置,您可以通过它摆脱 302 重定向:

<setting name="RequestErrors.UseServerSideRedirect" value="true" />

使用此设置,url 保持不变,状态码为 404。如果您想要一些额外的逻辑(例如将 Sitecore 项目显示为错误页面),Sitecore Market Place上有一个名为 Error Manager 的共享源模块。

希望有帮助。

于 2013-03-25T08:50:08.123 回答
0

您可以通过创建新的解析器来解决它。当您想以正确的语言提供用户错误页面时,这是一个很好的解决方案。但在 IIS 7.0 和 7.5 中存在一些差异。

将处理器添加到您的站点核心配置:

<processor type="Sitecore.Pipelines.HttpRequest.ItemResolver, Sitecore.Kernel"/>
<processor type="Project.Error404Resolver, Project" />

处理器解决它:

对于 IIS 7.0:

public class Error404Resolver : Sitecore.Pipelines.HttpRequest.HttpRequestProcessor
{
    public override void Process(Sitecore.Pipelines.HttpRequest.HttpRequestArgs args)
    {
        if(Sitecore.Context.Item == null && !args.Context.Request.Url.AbsolutePath.StartsWith("/sitecore")
        {
            args.Context.Response.Clear();

            SiteContext site = Sitecore.Context.Site;
            if(site != null)
            {
                Item item404Page = Sitecore.Context.Database.GetItem(site.RootPath + "website/error/404");
                if(item404Page != null)
                {
                    Sitecore.Context.Item = item404Page;
                    args.Context.Response.StatusCode = (int) System.Net.HttpStatusCode.NotFound;
                }
            }
        }
    }
}

对于 IIS 7.5:

public class Error404Resolver : Sitecore.Pipelines.HttpRequest.HttpRequestProcessor
{
    public override void Process(Sitecore.Pipelines.HttpRequest.HttpRequestArgs args)
    {
        if(Sitecore.Context.Item == null && !args.Context.Request.Url.AbsolutePath.StartsWith("/sitecore")
        {
            args.Context.Response.Clear();

            SiteContext site = Sitecore.Context.Site;
            if(site != null)
            {
                Item item404Page = Sitecore.Context.Database.GetItem(site.RootPath + "website/error/404");
                if(item404Page != null)
                {
                    WebClient webClient = new WebClient();
                    webClient.Encoding = args.Context.Request.ContentEncoding;
                    webClient.Headers.Add("User-Agent", args.Context.Request.UserAgent);
                    string page = webClient.DownloadString(LinkManager.GetItemUrl(item404Page));

                    args.Context.Response.StatusCode = (int) System.Net.HttpStatusCode.NotFound;
                    args.Context.Response.Write(page);
                    args.Context.Response.TrySkipIisCustomErrors = true;
                    args.Context.Response.End();
                }
            }
        }
    }
}

这样,您将在当前页面中呈现错误页面而无需重定向并返回到浏览器代码 404。

于 2013-08-14T10:28:29.100 回答
0

检查服务器是否能够访问您网站的主机名。

服务器通常无法访问 DNS,因此无法解析主机名。为了让您的 404 处理程序正常工作,应用程序需要能够访问其自己的主机名来请求 404 页面。

为确保这有效,请编辑服务器的主机文件并在其中添加一个主机名条目,将其指向 127.0.0.1

于 2013-03-25T11:29:14.317 回答
0

我目前工作的一位客户遇到了同样的问题(看起来代码已粘贴),实际上原因很明显:如果您使用未在 Sitecore 站点配置中注册的 url 执行此调用(但可通过 IIS 访问) ),您还将运行此代码。不幸的是,WebUtil.ExecuteWebPage 调用也是使用错误的 url 执行的,因此您最终会陷入循环。

实际上,您应该在日志中看到很多这样的消息:回退到默认重定向行为。错误 {0} 的原因,可能与超时有关。

如果你真的想使用你的自定义处理程序,你应该在调用 WebUtil.ExecuteWebPage 之前检查你是否在正确的站点上下文中。

于 2015-11-03T10:40:37.453 回答