如何在 ASP.NET Core 中使用 URL Rewriting 中间件

URL rewriting 是根据预先配置好的一组规则去修改 request url,值得注意的是:URL Rewriting 的重写功能和 url 重定向 是两个概念,本篇我们就来讨论下如何在 ASP.NET Core 中对 url 进行 rewriting。

安装 URL Rewriting 中间件

要想使用 URL Rewriting 功能,需要通过 nuget 引用 Microsoft.AspNetCore.Rewrite 包,可以通过 Visual Studio 2019 的 NuGet package manager 可视化界面安装 或者 通过 NuGet package manager 命令行工具输入以下命令:


dotnet add package Microsoft.AspNetCore.Rewrite

url重定向 和 url重写

url重定向url重写 是两个完全不同的概念,url重定向是 server 端返回 Http Status Code 301 或者 302 给 客户端并且告诉客户端使用另一个链接访问资源,客户端拿到新链接后实现跳转,从这个过程中可以看出,这个操作是发生在客户端,而且还多了一个不可回避的 round-trip

相反,url重写 是server端的操作,它会根据预先指定的一组规则去修改request url,在 rewriting 的过程中,修改后的 request url 不会和 重定向 一样再发送给客户端,只要是在一个请求内,client 根本不关心 server 端内部是如何实现资源切换的,值得注意的是,URL rewriting 也不是什么新的技术,在 ASP.NET 时代就有了。

总的来说,url重写 是发生在 server 端,并且没有所谓的 round-trip

配置 url 重定向

可以在 Startup 类中进行 URL rewritingURL redirection 功能配置,举个例子,实现 http 请求自动跳转成 https。

public class Startup{public void Configure(IApplicationBuilder app, IWebHostEnvironment env){app.UseRewriter(new RewriteOptions().AddRedirectToHttps());}}

配置 URL rewriting

下面的代码展示了 URL rewriting,请注意 request url 已经被 AddRewrite 的规则所监视。

public class Startup{public void Configure(IApplicationBuilder app, IWebHostEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}else{app.UseExceptionHandler("/Home/Error");}app.UseStaticFiles();//rewritevar rewrite = new RewriteOptions().AddRewrite("Home/Index", "Home/Privacy", true);app.UseRewriter(rewrite);app.UseRouting();app.UseAuthorization();app.UseEndpoints(endpoints =>{endpoints.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");});}}

从图中可以看出,url 请求的是 Home/Index,显示的是 Home/Privacy 内容,如果你有更加复杂的业务需求,可以使用 正则表达式 来定义规则,如下代码所示:

var rewrite = new RewriteOptions().AddRewrite(@"^Home/User?Code=(\d+)", "Home/$1", true);app.UseRewriter(rewrite);

使用自定义的 URL rewriting

如果正则表达式都不能满足需求,完全可以 自定义 来实现深度定制,只需要实现 IRule 接口中的 ApplyRule 方法即可,如下代码所示:

public class CustomRule : Microsoft.AspNetCore.Rewrite.IRule{public void ApplyRule(RewriteContext context){throw new NotImplementedException();}}

下面的代码展示了如何使用 ApplyRule,不过这里只是为了演示目的,你可以根据自己的需求来实现。

public class CustomRule : Microsoft.AspNetCore.Rewrite.IRule{public void ApplyRule(RewriteContext context){var request = context.HttpContext.Request;var host = request.Host;if (host.Host.Contains("localhost",StringComparison.OrdinalIgnoreCase)){if(host.Port == 80){context.Result = RuleResult.ContinueRules;return;}               }var response = context.HttpContext.Response;response.StatusCode = (int)HttpStatusCode. BadRequest;context.Result = RuleResult.EndResponse;}}

将 自定义规则 添加到 rule 集合

可以在 Startup.Configure 方法中将自定义的rule规则添加到 rule 集合中,如下代码所示:

public void Configure(IApplicationBuilder app, IHostingEnvironment env){var options = new RewriteOptions();options.Rules.Add(new CustomRule())app.UseRewriter(options);}

总结一下:URL rewriting 切断了 url地址 和 资源 的映射关系,你可以利用这项技术定义一些非常语义化的 url 地址,也方便 搜索引擎 收录。

译文链接:https://www.infoworld.com/article/3445867/how-to-use-url-rewriting-middleware-in-aspnet-core.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306137.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

睡眠分期matlab代码,非接触式睡眠分期方法与流程

本发明属于雷达监测技术领域,特别是一种非接触式睡眠分期方法。背景技术:传统的呼吸睡眠监护系统主要依靠贴附于人体的接触式传感器、电极进行测量,从而实时获得人体的生命参数信号,这些方法都需要直接或间接地接触人体&#xff0…

self php语法,PHP代码审计之关于PHP_SELF的简单利用

这两天突然看到 https://blog.ripstech.com/2020/sql-injection-impresscms/,想着复现一下,记录一下学习过程。漏洞分析漏洞复现首先我们先下载安装一下这个 cms,然后直接访问:http://127.0.0.1:81/admin.php/modules/system and …

叮咚!你有一份来自明源云的圣诞邀约

请查收,来自明源云的圣诞邀约~

使用Select.HtmlToPdf 把html内容生成pdf文件

概述.NET的SelectPdf Html到Pdf转换器-社区版是.NET的SelectPdf库中提供的功能强大的html到pdf转换器的免费版本。转换器提供了许多强大的选项(将任何网页转换为pdf,将任何html字符串转换为pdf,html5 / css3 / javascript支持,页眉…

java先进先出 循环队列,JavaScript队列、优先队列与循环队列

队列是一种遵从先进先出(FIFO)原则的有序集合队列在尾部添加新元素,从顶部移除元素队列的理解队列在我们生活中最常见的场景就是排队了队列这个名字也已经很通俗易懂了和栈很像,这不过队列是先入先出的数据结构队列的前面是队头队列的后面是队尾出队从队…

Abp小试牛刀之 图片上传

图片上传是很常见的功能,里面有些固定的操作也可以沉淀下来。本文记录使用Abp vNext做图片上传的姿势。目标上传图片----->预览图片----->确定保存支持集群部署实现思路:1. 上传图片要使用WebAPI特定媒体类型:multipart/form-data;2. 因…

php 发邮件 500错误,使用PHP发送邮件出现这个错误:The following From address failed:xxxx@163.com...

使用了TP框架!以下是源码:namespace ApiController;use ThinkController;class EmailController extends Controller{public function test(){$msg pmail(493107977qq.com,午夜DJ,封装测试,hello world);echo $msg;}?php>return array(//配置项>配置值TMPL_PARSE_STRIN…

.Net Conf 2020 之回顾

Intro上周 .NET Conf 在苏州成功举办了第二届活动,一年一度的 .NET 盛会又来了,今年大会依然有许多从外地过来参加的开发者们,也有很多讲师也是从外地赶过来为我们分享。虽然今年是疫情的一年,并没有影响 .NET Conf 参会者们的热情…

php里面电话验证码,PHP的中问验证码

Class code{var $width 160; //图片的宽var $hight 40; //图片的高var $image;var $red 223; //图片的RGB颜色var $green 225; //红var $blue 227 ;//绿var $pix 227 ;//蓝var $pixcolor; //杂色颜色;var $pixred 242; //红var $pixgreen 168;//绿var $pixblue 162; //蓝var…

如何使用 C# 在异步代码中处理异常

异常处理是一种处理运行时错误的技术,而 异步编程 允许我们在处理资源密集型的业务逻辑时不需要在 Main 方法或者在 执行线程 中被阻塞,值得注意的是,异步方法和同步方法的异常处理机制是不一样的,本篇我们就来讨论下如何在异步方…

在oracle中游标的操作,Oracle中的游标和函数详解

Oracle中的游标和函数详解1.游标游标是一种 PL/SQL 控制结构;可以对 SQL 语句的处理进行显示控制,便于对表的行数据逐条进行处理。 游标并不是一个数据库对象,只是存留在内存中。操作步骤:声明游标打开游标取出结果,此…

对 Redis 中的有序集合SortedSet的理解

本篇说一下Redis中的 有序集合类型,曾几何时,我们想把所有数据存到内存中的 数据结构 中,但为了多机器共享内存,不得不将这块内存包装成wcf单独部署,同时还要考虑怎么序列化,烦心事太多太多。。。后来才知道…

php查询类似abab,ABAB中的正则表达式匹配编号(必须相同) - php

我已经搜索了许多答案来匹配ABAB pattern,这些答案与1212或2323的任意字符匹配,已阅读this too但我发现匹配ABAB模式的模式不起作用,它也匹配4444我试图找出模式来匹配以下主题:232345459898但可能不匹配4444或5555,因…

代码质量在「内卷时代」的重要性

这里是Z哥的个人公众号每周五11:45 按时送达当然了,也会时不时加个餐~我的第「173」篇原创敬上大家好,我是Z哥。提到代码质量,不知道你的脑海中浮现出的第一个词是什么?规范?可读性?…

oracle asm 配置失败,Oracle ASMLib安装与配置

什么是ORACLE ASMLib?ASMLib 是一个适用于 Oracle 数据库 的自动存储管理(ASM)功能的支持库。ASM简化了数据库和管理,它不再需要 DBA 直接管理可能数千个的 Oracle 数据库文件,而只需管理分配给 Oracle 数据库的磁盘组。ASMLib 令使用 ASM 的…

.NET Core AWS S3云存储

【导读】最近有需要用到AWS S3云存储上传附件,这里对利用.NET或.NET Core在调用SDK APi需要注意的一点小问题做个记录,或许能对后续有用到的童鞋提供一点帮助Amazon Simple Storage Service (Amazon S3) 是一种对象存储服务,提供行业领先的可…

oracle数据库查看size,[oracle] 查看oracle数据库表空间使用率,定位数据size较大对象...

1.查看表空间使用情况with ts as (SELECT d.tablespace_name "Name", d.status "Status",TO_CHAR (NVL (a.MAXBYTES / 1024 / 1024 /1024, 0), 99,999,990.90) "Maxsize (G)",TO_CHAR (NVL (a.BYTES / 1024 / 1024 /1024, 0), 99,999,990.90) &q…

如何解决在ASP.NET Core中找不到图像时设置默认图像

背景web上如果图片不存在一般是打xx,这时候一般都是会设置默认的图片代替。现在用中间件的方式实现统一设置, 一次设置,全部作用 。此示例演示如何解决在ASP.NET Core中找不到图像时设置默认图像先决条件Visual Studio 2017或更高版本。启用V…

缩减oracle日志,[20180829]减少日志生成量.txt

[20180829]减少日志生成量.txt--//最近一段时间优化一下生产数据库,主要是问题比我预计要严重,实际上exadata实在太快了,把许多问题都给掩盖了.--//实际上这个问题很早就存在,我实在不想提,基于国内许多应用都可能存在类似问题,还是写一下.SQL ordered by Executions%CPU - CPU…

ACM中算法时间约束

ACM中算法时间约束 一般ACM竞赛C/C的时间限制是一秒,因此可以根据题目数据来推断该题所使用的算法。 算法的时间复杂度在 1 0 7 10^7 107左右合适,最多不能超过 1 0 8 10^8 108, O ( n ) O(n) O(n)的极限就在 1 0 8 10^8 108左右。 问题规…