サイトコア マルチサイト ソリューションで 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 設定で定義されている)、404 をスローしようとする base.RedirectOnItemNotFound を実行しています)。カスタム 404 ハンドラーが再び呼び出されるため、リダイレクト ループに陥ります。
そのため、誰かが 404 ページをサイトの 1 つに追加するのを忘れると、他のすべてのサイトが停止し、膠着状態になります。
私の質問は、サイトの 1 つに 404 ページがない場合、このシナリオを処理する最善の方法は何でしょうか?
base.Redirect..? の代わりに例外を再スローします。
乾杯