ILovePaperTowels
ILovePaperTowels

Reputation: 1455

ASP.NET Response.Redirect uses 302 instead of 301

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?

Upvotes: 33

Views: 34253

Answers (5)

Borja Abad
Borja Abad

Reputation: 1

For me that works

Response.Status="301 Moved Permanently"
Response.AddHeader "Location", "NewURL"
Response.end

Upvotes: 0

KeithS
KeithS

Reputation: 71565

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();

Upvotes: 39

sobelito
sobelito

Reputation: 1615

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;
        }
      }
    }
  }
}

Upvotes: 1

Priyank
Priyank

Reputation: 10623

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

Upvotes: 4

Adam Butler
Adam Butler

Reputation: 2753

If you're using ASP.Net 4.0, you can use Response.RedirectPermanent, which will use 301 instead of 302.

Upvotes: 56

Related Questions