public override void Process(HttpRequestArgs args) { Assert.ArgumentNotNull(args, "args"); string url = args.Context.Request.Url.PathAndQuery; // if ItemResolver failed to find an Item if (((Context.Item == null) && string.IsNullOrEmpty(Context.Page.FilePath)) || url.Contains("404;")) { // extract 404 url if (url.Contains("404;")) { url = Regex.Replace(HttpUtility.UrlDecode(url), ".*404;(.*)", "$1"); } // find an Item Redirect RedirectEntry redirect = RedirectManager.GetRedirect(Sitecore.Context.GetSiteName(), url); if (redirect != null) { UrlString newUrl = null; Item item = Context.Database.GetItem(new ID(redirect.ItemID)); if (item != null) { UrlOptions options = LinkManager.GetDefaultUrlOptions(); newUrl = new UrlString(LinkManager.GetItemUrl(item, options)); } if (newUrl != null && !string.IsNullOrEmpty(redirect.QueryString)) { var qsParameters = StringUtil.ParseNameValueCollection(redirect.QueryString, '&', '='); foreach (string key in qsParameters.AllKeys) { newUrl[key] = qsParameters[key]; } } // avoid looping if (newUrl != null && string.Compare(url, newUrl.ToString(), true) != 0) { args.AbortPipeline(); RedirectUtils.Do301Redirect(args.Context.Response, newUrl.ToString()); } } // no Item redirect found, try a NotFoundRule else if (url != null) { NotFoundRule rule = RedirectManager.ResolveRedirectRule(Sitecore.Context.GetSiteName(), url); if (rule != null) { ExecuteRule(url, rule, args); } } } }
public void ExecuteRule(string url, NotFoundRule rule, HttpRequestArgs args) { Assert.ArgumentNotNull(url, "url"); Assert.ArgumentNotNull(rule, "rule"); Assert.ArgumentNotNull(args, "args"); // execute a sub pipeline if (!string.IsNullOrEmpty(rule.Pattern) && !string.IsNullOrEmpty(rule.Method)) { object command = ReflectionUtil.CreateObject(rule.Type, new object[] { }); if (command != null) { try { ReflectionUtil.CallMethod(command, rule.Method, new object[] { args }); } catch (System.Threading.ThreadAbortException) { //don't log. this is expected. } catch (Exception ex) { Log.Error("NotFoundRule Error", ex, this); } } } // or redirect to new url or regex else if (rule.NewUrl.Length > 0) { Regex reg = new Regex(rule.Pattern, RegexOptions.IgnoreCase); string newUrl = reg.Replace(url, rule.NewUrl); switch (rule.StatusCode) { case "301": RedirectUtils.Do301Redirect(args.Context.Response, newUrl); break; case "302": RedirectUtils.Do302Redirect(args.Context.Response, newUrl); break; case "404": RedirectUtils.Do404Redirect(args.Context.Response, newUrl); break; default: WebUtil.Redirect(newUrl, false); break; } args.Context.Response.End(); } }