Кажется, что выбор 302 вместо 301 был немного произвольным для начала.Однако из этого не обязательно следует, что каждый URL-адрес будет «иметь» использование схемы HTTPS.Там вполне может быть страница, которая разрешает доступ как по HTTP, так и по HTTPS, даже если это может поощрять последнее.Реализация, в которой это может произойти, может иметь некоторый код, предназначенный для определения того, использовать ли HTTPS или нет на основе некоторых специальных критериев.
В качестве сценария, приведенного выше, взгляните на Gmail.В настройках можно разрешить или запретить протокол HTTPS для больших частей приложения.Какой код должен быть возвращен тогда?301 не будет точным, так как он не «постоянный» ... только изменение по указанию пользователя.К сожалению, 302 также не совсем точен, потому что ошибка 302 подразумевает, что в какой-то момент в будущем есть намерение изменить ссылку (соответствующая ссылка http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html).
Конечно, Gmail - грубый пример, потому чточасти сайта, которые разрешают эту опцию, обычно не индексируются поисковой системой, но возможность все еще существует.
И чтобы ответить на ваш последний вопрос, если вам нужен другой код состояния в ASP.NET MVC (которыйЯ предполагаю, что вы используете из небольшого примера синтаксиса), это можно изменить с помощью простого пользовательского атрибута:
public class MyRequireHttpsAttribute : RequireHttpsAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
if (!filterContext.HttpContext.Request.IsSecureConnection)
filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.MovedPermanently;
}
}
Теперь все действия, которые реализуют атрибут, должны возвращать код состояния 301 при доступе черезпротокол HTTP.