используя следующий код
context.Response.StatusCode = 301;
context.Response.Redirect(newUrl, true);
context.Response.End();
Я вижу в скрипаче, что он использует 302 вместо 301. Должен ли я устанавливать статус после перенаправления?
используя следующий код
context.Response.StatusCode = 301;
context.Response.Redirect(newUrl, true);
context.Response.End();
Я вижу в скрипаче, что он использует 302 вместо 301. Должен ли я устанавливать статус после перенаправления?
Если вы используете ASP.Net 4.0, вы можете использовать Response.RedirectPermanent, который будет использовать 301 вместо 302.
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();
301 работает с кэшем. если вы используете ASP.NET 4.0, вы можете использовать RedirectPermanent.
Кроме того, установите свой код состояния после перенаправления
также изучите эти ответы. Response.Redirect HTTP status code
Я совмещаю приведенные выше ответы с тем, что я использую, если у меня есть старые домены/поддомены для разных версий сайта, которые я хочу перенаправить на текущий, главным образом по причинам 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;
}
}
}
}
}