web-dev-qa-db-fra.com

ASP.NET Response.Redirect utilise 302 au lieu de 301

en utilisant le code suivant

context.Response.StatusCode = 301;

context.Response.Redirect(newUrl, true);
context.Response.End();

Je peux voir dans Fiddler qu'il utilise un 302 au lieu d'un 301. Dois-je définir le statut après l'appel de redirection?

28
ILovePaperTowels

Si vous utilisez ASP.Net 4.0, vous pouvez utiliser Response.RedirectPermanent , qui utilisera 301 au lieu de 302.

49
Adam Butler

Response.Redirect () remplacera la propriété StatusCode par le code d'une redirection (302). De plus, comme vous utilisez la surcharge Response.Redirect () en prenant le paramètre boolean, vous devez le définir sur False si vous souhaitez appeler Response.End () vous-même. Sinon, c'est redondant et peut causer des erreurs.

Essayez ce qui suit (pre-ASP.NET 4.0; la réponse d'Adam Butler couvre la nouvelle meilleure pratique):

context.Response.Redirect(newUrl, false);
context.Response.StatusCode = 301;
context.Response.End();
34
KeithS

301 est en cache. Si vous utilisez ASP.NET 4.0, vous pouvez utiliser RedirectPermanent .

Définissez également votre code d'état après la redirection

aussi, examinez ces réponses. Code d'état HTTP Response.Redirect

4
Priyank

Je combine les réponses ci-dessus avec quelque chose que j'utilise si j'ai d'anciens domaines/sous-domaines pour différentes versions d'un site que je veux rediriger vers l'actuel, principalement pour des raisons de référencement, afin de ne pas avoir plusieurs versions du même site. à différentes URL:

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