I have replaced the original AliasResolver with one that redirects with a 301 header which solves the problem.
Create a new class with the original AliasResolver code and replace the "ProcessItem" method with the following:
private bool ProcessItem(HttpRequestArgs args) { ID targetID = Context.Database.Aliases.GetTargetID(args.LocalPath); if (!targetID.IsNull) { Item item = args.GetItem(targetID); if (item != null) { HttpContext.Current.Response.RedirectLocation = item.Paths.FullPath.ToLower().Replace(Context.Site.StartPath.ToLower(), string.Empty); HttpContext.Current.Response.StatusCode = 301; HttpContext.Current.Response.Status = "301 Moved Permanently"; HttpContext.Current.Response.End(); } return true; } Tracer.Error("An alias for \"" + args.LocalPath + "\" exists, but points to a non-existing item."); return false; }In the web.config:
Replace
<processor type="Sitecore.Pipelines.HttpRequest.AliasResolver, Sitecore.Kernel"/>
With the reference to your new class.