在 Kestrel 中重写后获得原始 URL
Get original URL after rewriting in Kestrel
Apache 会根据重写的 URL 选择一个文件来提供服务,但是原始的 URL 会被传递给脚本。
Kestrel 将重写的 URL 传递到管道(可通过 HttpContext.Request.Path
访问)。
中间件重写后是否可以访问原始URL?
按照@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"] });
}
Apache 会根据重写的 URL 选择一个文件来提供服务,但是原始的 URL 会被传递给脚本。
Kestrel 将重写的 URL 传递到管道(可通过 HttpContext.Request.Path
访问)。
中间件重写后是否可以访问原始URL?
按照@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"] });
}