web-dev-qa-db-ja.com

ASP.NET Response.Redirectは、301ではなく302を使用します

次のコードを使用して

context.Response.StatusCode = 301;

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

フィドラーで、301ではなく302を使用していることがわかります。リダイレクト呼び出しの後にステータスを設定する必要がありますか?

29

ASP.Net 4.0を使用している場合は、 Response.RedirectPermanent を使用できます。これにより、302ではなく301が使用されます。

49
Adam Butler

Response.Redirect()は、StatusCodeプロパティをリダイレクトのコード(302)で上書きします。また、ブール型パラメーターを取得するResponse.Redirect()オーバーロードを使用しているため、自分でResponse.End()を呼び出す場合は、Falseに設定する必要があります。それ以外の場合は冗長であり、エラーを引き起こす可能性があります。

以下を試してください(ASP.NET 4.0以前。AdamButlerの回答は新しいベストプラクティスをカバーしています):

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

301はキャッシュ可能です。 ASP.NET 4.0を使用している場合は、 RedirectPermanent を使用できます。

また、リダイレクト後にステータスコードを設定します

また、これらの答えを調べてください。 Response.Redirect HTTPステータスコード

4
Priyank

同じサイトに複数のバージョンがないように、主に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;
        }
      }
    }
  }
}
0
sobelito