Получить оригинальный 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"] });
}