我正在使用以下实现来处理sitecore多站点解决方案中的404:
在ExecuteRequest管道的自定义实现中,
protected override void RedirectOnItemNotFound(string url)
{
var context = HttpContext.Current;
try
{
// Request the NotFound page
var domain = context.Request.Url.GetComponents(
UriComponents.Scheme | UriComponents.Host,
UriFormat.Unescaped);
string content;
using(var webClient = new WebClient())
{
content = webClient
.DownloadString(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("Failed on URL: {0}. Falling back to default redirection behaviour. Reason for error {1}", url, ex), ex);
// Fall back to default behavior on exceptions
base.RedirectOnItemNotFound(url);
}
context.Response.End();
}
现在您可以看到,如果找不到404页面(即没有404页面(在站点的web.config中Sitecore的ItemNotFound设置中定义),那么我正在做base.RedirectOnItemNotFound,它试图有效地抛出404再次回到我的自定义404处理程序,因此它落入重定向循环。
因此,如果有人忘记将404页面添加到其中一个网站,那么它会导致所有其他网站崩溃并陷入僵局。
我的问题是,在其中一个网站没有404页面的情况下,处理这种情况的最佳方法是什么?
重新抛出异常而不是base.Redirect ..?
干杯
答案 0 :(得分:1)
在您的方案中,我建议您为所有网站提供全球404页面。
如果您没有网站404页面,则必须显示该全局页面中的内容。
在Sitecore结构上创建网站时,您可以使用分支模板创建,并且可以为所有网站添加404页面。
此外,您还可以修复所有网站的每404页的安全性。只是一些特殊角色(管理员)将删除404页面。
答案 1 :(得分:0)
我想如果没有设置网站特定的错误页面,最好的方法是将其重定向到基本的Sitecore notfound页面,使用url /sitecore/service/notfound.aspx
更好的做法是在IIS管理器本身。 步骤如下:
据我所知,这可以解决您的问题。
让我知道会发生什么。 如果您需要查看如何对IIS管理器中的错误页面进行更改,请参阅我回答过的类似问题(Sitecore - Handle 500 errors separately per site in multisite setup)
希望此输入可以帮助您!
此致 Varun Shringarpure