ASP.NET Response.Redirect使用302而不是301

时间:2011-09-19 23:00:16

标签: asp.net redirect

使用以下代码

context.Response.StatusCode = 301;

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

我可以在提琴手中看到它使用302而不是301.我应该在重定向呼叫后设置状态吗?

5 个答案:

答案 0 :(得分:49)

如果您使用的是ASP.Net 4.0,则可以使用Response.RedirectPermanent,它将使用301而不是302.

答案 1 :(得分:34)

Response.Redirect()将使用重定向代码(302)覆盖StatusCode属性。另外,因为您正在使用带有布尔参数的Response.Redirect()重载,所以如果您想自己调用Response.End(),则应将其设置为False。否则它是多余的,可能会导致错误。

尝试以下方法(pre-ASP.NET 4.0; Adam Butler的答案涵盖了新的最佳实践):

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

答案 2 :(得分:4)

301可以缓存。如果您使用的是ASP.NET 4.0,则可以使用RedirectPermanent

此外,请在重定向

后设置状态代码

另外,看看这些答案。 Response.Redirect HTTP status code

答案 3 :(得分:0)

我将上面的答案与我使用的东西结合起来如果我有一个旧的域/子域用于我想要重定向到当前的网站的不同版本,主要是出于SEO的原因,以便没有多个版本的不同网址的同一网站:

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

答案 4 :(得分:0)

对我来说有效

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