[译]ASP.NET Core 2.0 网址重定向
问题
如何在ASP.NET Core 2.0中实现网址重定向?
答案
新建一个空项目,在Startup.cs文件中,配置RewriteOptions参数并添加网址重定向中间件(UseRewriter):
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{var rewrite = new RewriteOptions().AddRedirect("films", "movies").AddRewrite("actors", "stars", true);app.UseRewriter(rewrite);app.Run(async (context) =>{var path = context.Request.Path;var query = context.Request.QueryString;await context.Response.WriteAsync($"New URL: {path}{query}");});
}
运行,并在浏览器地址栏输入:http://localhost:56825/films,通过客户端调试工具观察重定向过程:
在地址栏输入:http://localhost:56825/actors,再次观察重定向过程:
讨论
网址重定向就是根据用户自定义规则来修改请求的网址,目的是为了将服务器资源和浏览器网址解绑定。这样做可能是出于安全考虑, 搜索引擎优化(SEO),用户友好网址,将HTTP重定向到HTTPS等多种目的。
当你无法使用Web服务器(IIS,Apache,Nginx)的重定向功能时,ASP.NET Core提供了一个可选项 - 请求网址重定向中间件。然后它的性能和功能比不上Web服务器的重定向。
重定向中间件可以做两件事情:客户端重定向和服务器重写:
重定向(客户端)
这是一个客户端操作,工作流程如下:
1. 客户端请求一个资源,比如 /films
2. 服务器返回301(Moved Permanently)或者302(Found)状态码,并在响应头中添加Location属性,用来指示浏览器请求新的地址(比如/movies)。
3. 客户端请求新的地址,并显示在浏览器的地址栏中。
重写(服务端)
它是一个服务器端操作,工作流程如下:
1. 客户端请求一个资源,比如 /actors
2. 服务器将其内部映射到新的地址(比如/stars)并且返回200(OK)。
在此过程中,客户端并不知道服务器端的内部映射操作,因此用户看到的浏览器地址栏依然显示的是最初请求地址。
规则
重定向和重写规则可以是正则表达式,更加详细的信息请参考:https://docs.microsoft.com/en-gb/aspnet/core/fundamentals/url-rewriting
自定义重定向规则
我们也可以自定义重定向规则,通过一个继承自IRule接口的类来实现:
public class MoviesRedirectRule : IRule
{private readonly string[] _matchPaths;private readonly string _newPath;public MoviesRedirectRule(string[] matchPaths, string newPath){_matchPaths = matchPaths;_newPath = newPath;}public void ApplyRule(RewriteContext context){var request = context.HttpContext.Request;// 已经是目标地址了,直接返回if (request.Path.StartsWithSegments(new PathString(_newPath))){return;}if (_matchPaths.Contains(request.Path.Value)){var newLocation = $"{_newPath}{request.QueryString}";var response = context.HttpContext.Response;response.StatusCode = StatusCodes.Status302Found;context.Result = RuleResult.EndResponse;response.Headers[HeaderNames.Location] = newLocation;}}
}
然后在Configure()中,将此自定义规则添加到RewriteOptions里面:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{var rewrite = new RewriteOptions().Add(new MoviesRedirectRule(matchPaths: new string[] { "/films", "/features", "/albums" },newPath: "/movies"));app.UseRewriter(rewrite);app.Run(async (context) =>{var path = context.Request.Path;var query = context.Request.QueryString;await context.Response.WriteAsync($"New URL: {path}{query}");});
}
运行,在地址栏输入:http://localhost:56825/films?id=123,观察重定向过程:
源代码下载
原文:https://tahirnaushad.com/2017/08/18/url-rewriting-in-asp-net-core/
转载于:https://www.cnblogs.com/sanshi/p/7744957.html
[译]ASP.NET Core 2.0 网址重定向相关推荐
- [译]ASP.NET Core 2.0 部分视图
问题 如何在ASP.NET Core 2.0中使用部分视图来重用页面的公共部分? 答案 新建一个空项目,在Startup中添加MVC服务和中间件: public void ConfigureServi ...
- [译]ASP.NET Core 2.0 机密配置项
问题 如何在ASP.NET Core 2.0中保存机密配置项(不用将其暴露给源代码管理器)? 答案 创建一个ASP.NET Core 2.0空项目,在项目节点上点击右键,并点击菜单项 - 管理用户机密 ...
- [译]ASP.NET Core 2.0 带初始参数的中间件
问题 如何在ASP.NET Core 2.0向中间件传入初始参数? 答案 在一个空项目中,创建一个POCO(Plain Old CLR Object)来保存中间件所需的参数: public class ...
- 【转载】从头编写 asp.net core 2.0 web api 基础框架 (1)
工具: 1.Visual Studio 2017 V15.3.5+ 2.Postman (Chrome的App) 3.Chrome (最好是) 关于.net core或者.net core 2.0的相 ...
- 跟着老桂学ASP.NET Core 2.0
.net core作为微软开发技术中跨平台的利器,2.0的发布已经有一段时间了,asp.net core是新一代微软的BS开发框架,同时兼容.net core和.net framework,它的出现, ...
- 从头编写 asp.net core 2.0 web api 基础框架 (1)
工具: 1.Visual Studio 2017 V15.3.5+ 2.Postman (Chrome的App) 3.Chrome (最好是) 关于.net core或者.net core 2.0的相 ...
- ASP.NET Core 2.0和Angular 4:从头开始构建用于车辆管理的Web应用程序
目录 介绍 背景 使用代码 I)服务器端 a)先决条件 b)设置项目 c)设置数据库 d)使用AutoMapper e)使用Swagger f)运行API II)客户端 a)先决条件 b)设置项目 c ...
- 使用依赖注入的ASP.NET Core 2.0用户角色基础动态菜单管理
目录 介绍 背景 先决条件 使用代码 第1步 - 创建数据库 创建数据库 第2步 - 创建ASP.NET Core 更新appsettings.json 步骤3 - 在Startup.cs文件中添加I ...
- Amazing ASP.NET Core 2.0
前言 ASP.NET Core 的变化和发展速度是飞快的,当你发现你还没有掌握 ASP.NET Core 1.0 的时候, 2.0 已经快要发布了,目前 2.0 处于 Preview 1 版本,意味着 ...
最新文章
- AI 被当做炒作工具?
- 由system.currentTimeMillis() 获得当前的时间
- 11、MySQL算术运算符
- 输出和为n的所有的连续自然数序列
- python pyqt5 线程 暂停 重启_PyQt5 线程阻塞?
- AS3.0 XMLSocket简介
- linux系统调用和库函数调用
- oracle练习之查询1(where等)
- 升腾主机装linux,升腾终端安装说明
- 你的工具包已到货「GitHub 热点速览 v.22.31」
- Linux系统之账号和权限管理
- 教你设置QQ空间个性签名档
- matlab留学生作业代做,代写Canvas留学生作业、MatLab编程语言作业调试、MatLab实验作业代做、代写program课程作业...
- CINTA拉格朗日定理
- chemdraw怎么画拐弯的箭头_使用ChemDraw Prime 15的箭头工具绘制出弧线箭头
- 网站被劫持勒索怎么办
- 自己总结的linux命令
- 科学幻想其实是对科学研究的发展方向起到很好的引领作用
- 家庭中的交换机如何选择?几种常见的交换机选择避坑方法需要知道
- 整理的apollo 入门课程
热门文章
- 网页模板制作只为满足用户需求!
- qt linux mac,MacOS下Qt Installer Framework使用教程【个人经验】
- proteus如何添加stm32_【Proteus】单片机H桥驱动24V直流有刷电机
- 线头尾两端各插入块lisp_如何在一条线段两端插入带角度得块?
- decode函数_decode函数的妙用网友的两个问题解答
- (转载)Linux新增磁盘、分区、格式化和自动挂载
- 读书笔记《鸟哥的Linux私房菜-基础学习篇》man page 查询数据后数字的意思
- word2vec (一) 简介与训练过程概要
- nodejs Yarn替代npm的包管理——快速、安全、可靠性高的依赖管理
- 学习webpack(二)