Получить оригинальный URL после переписывания в Kestrel

Apache будет выбирать файл для обслуживания на основе переписанного URL, но исходный URL будет передан в сценарий.

Kestrel передает переписанный URL по конвейеру (доступно через HttpContext.Request.Path).

Можно ли получить доступ к оригинальному URL из Middleware после того, как он был переписан?

1 ответ

Решение

Следуя указаниям @Tseng. Мой тест оборачивает RewriteMiddleware, но вам может потребоваться отдельное промежуточное ПО.

public class P7RewriteMiddleware
{
    private RewriteMiddleware _originalRewriteMiddleware;

    public P7RewriteMiddleware(
        RequestDelegate next,
        IHostingEnvironment hostingEnvironment,
        ILoggerFactory loggerFactory,
        RewriteOptions options)
    {
        _originalRewriteMiddleware = new RewriteMiddleware(next, hostingEnvironment, loggerFactory, options);
    }

    /// <summary>
    /// Executes the middleware.
    /// </summary>
    /// <param name="context">The <see cref="HttpContext"/> for the current request.</param>
    /// <returns>A task that represents the execution of this middleware.</returns>
    public new Task Invoke(HttpContext context)
    {
        var currentUrl = context.Request.Path + context.Request.QueryString;
        context.Items.Add("original-path", currentUrl);
        return _originalRewriteMiddleware.Invoke(context);
    }
}

Позже мой фильтр авторизации использует его.

if (spa.RequireAuth)
{
   context.Result = new RedirectToActionResult(Action, Controller,
         new { area = Area, returnUrl = context.HttpContext.Items["original-path"] });
}
Другие вопросы по тегам