如何在 ASP.NET Core 中重写 URL

简介: 如何在 ASP.NET Core 中重写 URL

所谓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 Moved
Content-Type: text/html; charset=UTF-8
Location: 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的重写模块中获得的所有常见正则表达式扩展。


目录
相关文章
|
1月前
|
存储 开发框架 JSON
ASP.NET Core OData 9 正式发布
【10月更文挑战第8天】Microsoft 在 2024 年 8 月 30 日宣布推出 ASP.NET Core OData 9,此版本与 .NET 8 的 OData 库保持一致,改进了数据编码以符合 OData 规范,并放弃了对旧版 .NET Framework 的支持,仅支持 .NET 8 及更高版本。新版本引入了更快的 JSON 编写器 `System.Text.UTF8JsonWriter`,优化了内存使用和序列化速度。
|
1月前
mcr.microsoft.com/dotnet/core/aspnet:2.1安装libgdiplus
mcr.microsoft.com/dotnet/core/aspnet:2.1安装libgdiplus
29 1
|
2月前
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。
|
2月前
|
开发框架 .NET 中间件
ASP.NET Core Web 开发浅谈
本文介绍ASP.NET Core,一个轻量级、开源的跨平台框架,专为构建高性能Web应用设计。通过简单步骤,你将学会创建首个Web应用。文章还深入探讨了路由配置、依赖注入及安全性配置等常见问题,并提供了实用示例代码以助于理解与避免错误,帮助开发者更好地掌握ASP.NET Core的核心概念。
87 3
|
25天前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
2月前
|
开发框架 NoSQL .NET
利用分布式锁在ASP.NET Core中实现防抖
【9月更文挑战第5天】在 ASP.NET Core 中,可通过分布式锁实现防抖功能,仅处理连续相同请求中的首个请求,其余请求返回 204 No Content,直至锁释放。具体步骤包括:安装分布式锁库如 `StackExchange.Redis`;创建分布式锁服务接口及其实现;构建防抖中间件;并在 `Startup.cs` 中注册相关服务和中间件。这一机制有效避免了短时间内重复操作的问题。
|
3月前
|
开发框架 监控 .NET
开发者的革新利器:ASP.NET Core实战指南,构建未来Web应用的高效之道
【8月更文挑战第28天】本文探讨了如何利用ASP.NET Core构建高效、可扩展的Web应用。ASP.NET Core是一个开源、跨平台的框架,具有依赖注入、配置管理等特性。文章详细介绍了项目结构规划、依赖注入配置、中间件使用及性能优化方法,并讨论了安全性、可扩展性以及容器化的重要性。通过这些技术要点,开发者能够快速构建出符合现代Web应用需求的应用程序。
51 0
|
3月前
|
缓存 数据库连接 API
Entity Framework Core——.NET 领域的 ORM 利器,深度剖析其最佳实践之路
【8月更文挑战第28天】在软件开发领域,高效的数据访问与管理至关重要。Entity Framework Core(EF Core)作为一款强大的对象关系映射(ORM)工具,在 .NET 开发中扮演着重要角色。本文通过在线书店应用案例,展示了 EF Core 的核心特性和优势。我们定义了 `Book` 实体类及其属性,并通过 `BookStoreContext` 数据库上下文配置了数据库连接。EF Core 提供了简洁的 API,支持数据的查询、插入、更新和删除操作。
110 0
|
2月前
|
前端开发 JavaScript
前端JS截取url上的参数
文章介绍了两种前端JS获取URL参数的方法:手动截取封装和使用URLSearchParams。
45 0
|
3月前
|
开发框架 前端开发 .NET
Asp.net Webapi 的 Post 方法不能把参数加到 URL 中?试试这样写
Asp.net Webapi 的 Post 方法不能把参数加到 URL 中?试试这样写