2017-07-17 75 views
1

Apache将根据重写的URL选择要提交的文件,但原始URL将传递给脚本。在Kestrel中重写后获取原始URL

Kestrel将重写的URL传递给管道(可通过HttpContext.Request.Path访问)。

是否可以在中间件被重写后访问原始URL

+3

编写一个中间件,读它将它传递给管道(通过'HttpContext.Items'或任何其他适合你的方式) – Tseng

回答

0

遵循@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"] }); 
}