Разница между UseHttpsRedirection и AddDirectToHttpsPermanent в ASP.NET Core - PullRequest
0 голосов
/ 20 сентября 2018

В файле Startup.cs рассмотрите следующее:

public void ConfigureServices(IServiceCollection services)
{
    // Irrelevant code removed

    services.AddHttpsRedirection(options =>
    {
        options.RedirectStatusCode = StatusCodes.Status301MovedPermanently;
    });
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    // Irrelevant code removed

    app.UseHttpsRedirection();

    app.UseRewriter(new RewriteOptions()
        .AddRedirectToWwwPermanent()
        .AddRedirectToHttpsPermanent()
    );
}

Насколько я знаю, я должен использовать Rewriter, чтобы установить AddRedirectToWwwPermanent.У меня вопрос, должен ли я использовать app.UseHttpsRedirection() и AddRedirectToHttpsPermanent()?Или, если они делают то же самое, что я должен удалить?

Я просто хочу убедиться, что я перенаправляю на Https правильно, в сочетании с перенаправлением Wwww.

1 Ответ

0 голосов
/ 21 сентября 2018

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 для промежуточного программного обеспечения перезаписи, так что у вас просто есть одно промежуточное программное обеспечение, которое выполняет перенаправления.- Но в конце концов, это действительно не имеет значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...