写点什么

如何在 ASP.NET Core 中重写 URL

作者:喵叔
  • 2021 年 12 月 04 日
  • 本文字数:2125 字

    阅读完需:约 7 分钟

所谓 URL 重写指的是更改当前执行的 URL,将其指向另外的 URL 以继续处理当前请求或重定向到外部 URL。在 ASP.NET 中我们可以使用 HttpContext.RewritePath 方法,但在.NET Core 中它并不存在。下面我我们将学习重写和重定向之间的区别,和何时以及如何在 ASP.NET Core 中使用它们。实际开发中,常见的重写 URL 场景有如下四种:


  1. 跳转到旧内容;

  2. 创建好看的 URL;

  3. 需要处理其他 URL 的内容;

  4. 作为应用程序代码的一部分从一个操作重定向到另一个操作。


前两个非常简单,它们是简单的从一个 URL 跳转到另一个 URL,因为某些内容已经移动,或需要不同权限的用户看到不同内容的状态。这在实际项目中是很常见的,尤其是在已经存在了一段时间并且发生了一些变化的应用程序中。一个不太常见但可以说更有用的用例是用于呈现自定义内容工具的 URL 转换。最常见的重写场景是应用程序级别的,比如正在构建应用程序,需要在某个情况下重定向到另一个端点,例如登录和身份验证,点击登录 URL,这个 URL 将登录并作为登录流程的一部分,登录成功后将被重定向到起始页或传入的 URL 对应的页面中。大多数 HTML 应用程序和一些需要身份认证的 REST 服务有一些像这样需要显式重定向的请求。这是一个经典的重定向场景。上面简单的说了一下重写 URL 和重定向 URL 的例子,下面我们就来具体讲解以下重写和重定向。

重写

重写改变了当前请求的路径,通过中间件管道继续处理当前请求的所有现有状态。重写后,注册的任何中间件都会收到新的 URL,并使用新路径处理请求的其余部分。所有这一切都是作为一个单一的服务器请求的一部分发生的。


Tip:请求的 URL 保持不变,不会更改为重写的 URL。


我肯可以使用如下代码重写 URL:


context.Request.Path
复制代码

重定向

重定向是在浏览器中通过一个或 HTTP 响应头触发一个新的 HTTP 请求,来在服务器上触发一个新的请求。重定向是对客户端的 HTTP 标头的响应。重定向的头部如下:


HTTP/1.1 302 MovedContent-Type: text/html; charset=UTF-8Location: https://xxxxx.com/aaa
复制代码


重定向还可用于 301 Moved Permanently,让搜索引擎知道老的 URL 已被弃用。重定向的代码如下:


context.Response.Redirect()
复制代码


一般来说,重写比重定向来说往往会更有效,因为它避免了服务器往返。并且重写可以保留请求信息,因此拥有 POST 或 PUT 操作具有与其关联的数据,则该数据将保持完整,然而重定向总是由浏览器以 GET 作为操作重新发出,因此无法保留和使用重定向前的数据。

在 ASP.NET Core 中拦截 URL

在 ASP.NET Core 中执行这个操作,最简单的方法是使用 app.Use()内联中间件,可以将其添加到 Startup.Configure()方法中。下面的代码展示了如何在中间件中处理重写并操作 app.Use():


app.Use(async (context,next) =>{    var url = context.Request.Path.Value;    if (url.Contains("/home/privacy"))    {        context.Request.Path = "/home/index";    }    await next();});
复制代码


上面的代码会拦截每个传入的请求并检查要重写的 URL,当它找到时更改 context.Request.Path 并通过管道的后续部分继续处理,所有后续中间件组件现在都可以看到更新的路径。同样,我们也可以使用类似的方法进行重定向。因为重定向是个新的轻轻,因此需要终止中间件管道,代码如下:


app.Use(async (context,next) =>{    var url = context.Request.Path.Value;    if (url.Contains("/home/privacy"))    {        context.Response.Redirect("https://www.xxxx.com")        return;     }    await next();});
复制代码


一般来说,除非目标 URL 包含应用程序以外的 URL,否则的话我认为没有充分的理由在中间件中使用重定向。因为它只对外部的、非应用程序 URL 有用。但是凡事都有特殊情况,当我们需要将重定向作为应用程序/控制器逻辑的一部分时,在这种情况下不能使用重写操作,因为路径已经路由到应用程序端点/控制器方法。


TIP:

  1. 重定向时我们需要短路 Response,而不是继续通过中间件管道的其余部分。

  2. Response.Redirect()在 ASP.NET Core 中,不会像 ASP.NET 那样进行自动路径修复,必须指定整个路径。

ASP.NET Core 重写中间件模块

对于更复杂的重写和重定向场景,我们还可以使用 ASP.NET Core 重写中间件。它提供了设置基于 regEx 的重写和重定向,以及许多不同的和一些常见的重写操作的能力。


URL 重写中间件


加入需要对许多 URL 有复杂的规则或需要遵循特定模式来重新路由内容,则使用中间件非常有用。例如下面的代码:


var options = new RewriteOptions()            .AddRedirectToHttpsPermanent();            .AddRedirect("redirect-rule/(.*)", "redirected/$1")            .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2",                 skipRemainingRules: true)app.UseRewriter(options);
复制代码

总结

ASP.NET Core 中的 URL 重写很简单,只需更改调用 context.Request.PathURL 即可重写,以路由到某些不同的端点。对于外 URL 可以 context.Response.Redirect(),但要注意的是 Response.Redirect()它不会自动修复虚拟路径 ( ~/) 语法。对于简单的用例,使用显式中间件处理重写,对于需要基于规则的评估的更复杂的用例,不需要重新发明轮子,因为 ASP.NET Core 提供了重写中间件,该中间件使用基于 HTTP 的重写模块中获得的所有常见正则表达式扩展。

用户头像

喵叔

关注

还未添加个人签名 2020.01.14 加入

还未添加个人简介

评论

发布
暂无评论
如何在 ASP.NET Core 中重写 URL