using the following code
context.Response.StatusCode = 301; context.Response.Redirect(newUrl, true); context.Response.End();
I can see in fiddler that it’s using a 302 instead of a 301. Should I be setting the status after the redirect call?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
If you’re using ASP.Net 4.0, you can use Response.RedirectPermanent, which will use 301 instead of 302.
Method 2
Response.Redirect() will overwrite the StatusCode property with the code for a redirect (302). Also, because you’re using the Response.Redirect() overload taking the boolean parameter, you should set it to False if you want to call Response.End() yourself. Otherwise it’s redundant and can cause errors.
Try the following (pre-ASP.NET 4.0; Adam Butler’s answer covers the new best practice):
context.Response.Redirect(newUrl, false); context.Response.StatusCode = 301; context.Response.End();
Method 3
301 is cache-able. if you are using ASP.NET 4.0 , you can use RedirectPermanent.
Also, set your statuscode after Redirect
also, look into these answers. Response.Redirect HTTP status code
Method 4
I am combining the answers above with something I use if I have old domains/sub-domains for different versions of a site that I want to redirect to the current, mostly for SEO reasons, so as to not have multiple versions of the same site at different URLs:
using System;
using System.Net;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
namespace myapp.web {
public class Global : HttpApplication {
void Application_Start(object sender, EventArgs e) {
// Code that runs on application startup
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
protected void Application_BeginRequest(object sender, EventArgs e) {
//some of these checks may be overkill
if ((HttpContext.Current != null)
&& (HttpContext.Current.Request != null)
&& (HttpContext.Current.Request.ServerVariables != null)
&& (!String.IsNullOrEmpty(HttpContext.Current.Request.ServerVariables["HTTP_HOST"]))
) {
switch (HttpContext.Current.Request.ServerVariables["HTTP_HOST"]) {
case "old.url.com":
HttpContext.Current.Response.RedirectPermanent("https://new.url.com", true);
//status code is not needed if redirect perm is used
HttpContext.Current.Response.StatusCode = (int)HttpStatusCode.MovedPermanently;
HttpContext.Current.Response.End();
break;
case "nightly.old.url.com":
HttpContext.Current.Response.RedirectPermanent("https://nightly.new.url.com", true);
//status code is not needed if redirect perm is used
HttpContext.Current.Response.StatusCode = (int)HttpStatusCode.MovedPermanently;
HttpContext.Current.Response.End();
break;
}
}
}
}
}
Method 5
For me that works
Response.Status="301 Moved Permanently" Response.AddHeader "Location", "NewURL" Response.end
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0