Подтвердить что ты не робот

ASP.NET Response.Redirect использует 302 вместо 301

используя следующий код

context.Response.StatusCode = 301;

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

Я вижу в скрипаче, что он использует 302 вместо 301. Должен ли я устанавливать статус после перенаправления?

4b9b3361

Ответ 1

Если вы используете ASP.Net 4.0, вы можете использовать Response.RedirectPermanent, который будет использовать 301 вместо 302.

Ответ 2

Response.Redirect() перезапишет свойство StatusCode кодом для перенаправления (302). Кроме того, поскольку вы используете перегрузку Response.Redirect() с использованием логического параметра, вы должны установить значение False, если вы хотите вызвать Response.End() самостоятельно. В противном случае он избыточен и может вызвать ошибки.

Попробуйте следующее (pre-ASP.NET 4.0; ответ Адама Батлера охватывает новую передовую практику):

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

Ответ 3

301 работает с кэшем. если вы используете ASP.NET 4.0, вы можете использовать RedirectPermanent.

Кроме того, установите свой код состояния после перенаправления

также изучите эти ответы. Response.Redirect HTTP status code

Ответ 4

Я совмещаю приведенные выше ответы с тем, что я использую, если у меня есть старые домены/поддомены для разных версий сайта, которые я хочу перенаправить на текущий, главным образом по причинам SEO, чтобы не иметь нескольких версий один и тот же сайт с разными 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;
        }
      }
    }
  }
}