You will need to have a custom processor in the `<httpRequestBegin>` which see if the item in the url is valid or not. So, the patch will be as follows: <configuration xmlns:patch="http://www.sitecore.net/xmlconfig/"> <sitecore> <pipelines> <httpRequestBegin> <processor type="YourNamespaceHere, YourAssemblyHere" patch:after="processor[@type='Sitecore.Pipelines.HttpRequest.ItemResolver, Sitecore.Kernel']"/> </httpRequestBegin> </pipelines> </sitecore> </configuration> Now, the code will be as below: public class NotFoundProcessor : HttpRequestProcessor { #region Fields private static readonly List<string> UrlsToIgnoreByCustomProcessors = new List<string> { "/sitecore/", "/sitecore", "/layouts", "/layouts/", "/error500.aspx" }; #endregion public override void Process(HttpRequestArgs args) { if (UrlsToIgnoreByCustomProcessors.Any()) { foreach (var urlsToIgnore in UrlsToIgnoreByCustomProcessors) { if (HttpContext.Current.Request.Url.PathAndQuery.ToLower().Contains(urlsToIgnore)) { return; } } } //Check if Context Item is null if(Sitecore.Context.Item != null) { return; } //Get Path of Error 404 item from Site Definition var error404ItemPath = Sitecore.Context.Site.Properties["notFoundPageItemPath"]; var database = GetDatabase(); //Get Error 404 item from Sitecore var error404Item = database.GetItem(error404ItemPath); //Generate url for Error 404 item var itemUrl = LinkManager.GetItemUrl(error404Item).Replace(context.DomainName, string.Empty); //Perform Redirection HttpContext.Current.Server.TransferRequest(string.Format("~/{0}?status=404", itemUrl.TrimStart('/'))); HttpContext.Current.ApplicationInstance.CompleteRequest(); return; } protected virtual Database GetDatabase() { return Context.ContentDatabase ?? Context.Database; } }