AddRedirectToHttpsPermanent
(или его брат AddRedirectToHttps
) добавляет RedirectToHttpsRule
к устройству записи.Это правило работает следующим образом :
if (!context.HttpContext.Request.IsHttps)
{
var host = context.HttpContext.Request.Host;
if (SSLPort.HasValue && SSLPort.Value > 0)
{
// a specific SSL port is specified
host = new HostString(host.Host, SSLPort.Value);
}
else
{
// clear the port
host = new HostString(host.Host);
}
var req = context.HttpContext.Request;
var newUrl = new StringBuilder().Append("https://").Append(host).Append(req.PathBase).Append(req.Path).Append(req.QueryString);
var response = context.HttpContext.Response;
response.StatusCode = StatusCode;
response.Headers[HeaderNames.Location] = newUrl.ToString();
context.Result = RuleResult.EndResponse;
context.Logger?.RedirectedToHttps();
}
Таким образом, оно в основном получает текущее имя хоста и создает новый URL-адрес, который выглядит так же, за исключением того, что перед ним стоит https://
.Затем он устанавливает код состояния HTTP 301 и возвращает новый URL-адрес через заголовок Location
.
Правило затем выполняется как часть RewriteMiddleware
, которая в основном будет просто зацикливаться.через все зарегистрированные правила и в конечном итоге запустит приведенный выше код, а затем завершит ответ.
Напротив, именно так HttpsRedirectionMiddleware
работает внутри :
if (context.Request.IsHttps || !TryGetHttpsPort(out var port))
{
return _next(context);
}
var host = context.Request.Host;
if (port != 443)
{
host = new HostString(host.Host, port);
}
else
{
host = new HostString(host.Host);
}
var request = context.Request;
var redirectUrl = UriHelper.BuildAbsolute(
"https",
host,
request.PathBase,
request.Path,
request.QueryString);
context.Response.StatusCode = _statusCode;
context.Response.Headers[HeaderNames.Location] = redirectUrl;
_logger.RedirectingToHttps(redirectUrl);
return Task.CompletedTask;
Таким образом, он получит имя хоста из входящего запроса, а затем создаст абсолютный URL-адрес, используя UriHelper
, который выглядит точно так же, как текущий запрос, за исключением того, что он использует схему https://
.Затем он устанавливает результат кода состояния 307 HTTP и возвращает новый URL-адрес через заголовок Location
.Так как он не вызывает более поздние промежуточные программы, это также завершит ответ.
Так что да, эти два решения сильно отличаются ( не ): они используют в значительной степениэквивалентный код и выдает тот же результат.Единственное действительное отличие состоит в том, что HttpsRedirectionMiddleware
использует код состояния HTTP 307 по умолчанию.
Если вы предпочитаете один код состояния другому, вы можете полностью настроить оба промежуточных программ для использования предпочитаемого вами кода состояния.
Так какое промежуточное программное обеспечение следует использовать для включения перенаправления HTTPS?Это не имеет большого значения.Шаблоны ASP.NET Core поставляются с HttpsRedirectionMiddleware
по умолчанию, но это промежуточное программное обеспечение также существует только с ASP.NET Core 2.1.
Я бы лично придерживался HttpsRedirectionMiddleware
, поскольку он очень точно передает свое назначение.ясно.Но если у вас все равно есть RewriteMiddleware
, я бы просто заменил HttpsRedirectionMiddleware
на RedirectToHttpsRule
для промежуточного программного обеспечения перезаписи, так что у вас просто есть одно промежуточное программное обеспечение, которое выполняет перенаправления.- Но в конце концов, это действительно не имеет значения.