问题

如何在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 网址重定向相关推荐

  1. [译]ASP.NET Core 2.0 部分视图

    问题 如何在ASP.NET Core 2.0中使用部分视图来重用页面的公共部分? 答案 新建一个空项目,在Startup中添加MVC服务和中间件: public void ConfigureServi ...

  2. [译]ASP.NET Core 2.0 机密配置项

    问题 如何在ASP.NET Core 2.0中保存机密配置项(不用将其暴露给源代码管理器)? 答案 创建一个ASP.NET Core 2.0空项目,在项目节点上点击右键,并点击菜单项 - 管理用户机密 ...

  3. [译]ASP.NET Core 2.0 带初始参数的中间件

    问题 如何在ASP.NET Core 2.0向中间件传入初始参数? 答案 在一个空项目中,创建一个POCO(Plain Old CLR Object)来保存中间件所需的参数: public class ...

  4. 【转载】从头编写 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的相 ...

  5. 跟着老桂学ASP.NET Core 2.0

    .net core作为微软开发技术中跨平台的利器,2.0的发布已经有一段时间了,asp.net core是新一代微软的BS开发框架,同时兼容.net core和.net framework,它的出现, ...

  6. 从头编写 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的相 ...

  7. ASP.NET Core 2.0和Angular 4:从头开始构建用于车辆管理的Web应用程序

    目录 介绍 背景 使用代码 I)服务器端 a)先决条件 b)设置项目 c)设置数据库 d)使用AutoMapper e)使用Swagger f)运行API II)客户端 a)先决条件 b)设置项目 c ...

  8. 使用依赖注入的ASP.NET Core 2.0用户角色基础动态菜单管理

    目录 介绍 背景 先决条件 使用代码 第1步 - 创建数据库 创建数据库 第2步 - 创建ASP.NET Core 更新appsettings.json 步骤3 - 在Startup.cs文件中添加I ...

  9. Amazing ASP.NET Core 2.0

    前言 ASP.NET Core 的变化和发展速度是飞快的,当你发现你还没有掌握 ASP.NET Core 1.0 的时候, 2.0 已经快要发布了,目前 2.0 处于 Preview 1 版本,意味着 ...

最新文章

  1. AI 被当做炒作工具?
  2. 由system.currentTimeMillis() 获得当前的时间
  3. 11、MySQL算术运算符
  4. 输出和为n的所有的连续自然数序列
  5. python pyqt5 线程 暂停 重启_PyQt5 线程阻塞?
  6. AS3.0 XMLSocket简介
  7. linux系统调用和库函数调用
  8. oracle练习之查询1(where等)
  9. 升腾主机装linux,升腾终端安装说明
  10. 你的工具包已到货「GitHub 热点速览 v.22.31」
  11. Linux系统之账号和权限管理
  12. 教你设置QQ空间个性签名档
  13. matlab留学生作业代做,代写Canvas留学生作业、MatLab编程语言作业调试、MatLab实验作业代做、代写program课程作业...
  14. CINTA拉格朗日定理
  15. chemdraw怎么画拐弯的箭头_使用ChemDraw Prime 15的箭头工具绘制出弧线箭头
  16. 网站被劫持勒索怎么办
  17. 自己总结的linux命令
  18. 科学幻想其实是对科学研究的发展方向起到很好的引领作用
  19. 家庭中的交换机如何选择?几种常见的交换机选择避坑方法需要知道
  20. 整理的apollo 入门课程

热门文章

  1. 网页模板制作只为满足用户需求!
  2. qt linux mac,MacOS下Qt Installer Framework使用教程【个人经验】
  3. proteus如何添加stm32_【Proteus】单片机H桥驱动24V直流有刷电机
  4. 线头尾两端各插入块lisp_如何在一条线段两端插入带角度得块?
  5. decode函数_decode函数的妙用网友的两个问题解答
  6. (转载)Linux新增磁盘、分区、格式化和自动挂载
  7. 读书笔记《鸟哥的Linux私房菜-基础学习篇》man page 查询数据后数字的意思
  8. word2vec (一) 简介与训练过程概要
  9. nodejs Yarn替代npm的包管理——快速、安全、可靠性高的依赖管理
  10. 学习webpack(二)