路由跟URL 重写的功能性略有不同。路由是将Request 找到对应的服务,而URL 重写是为了推卸责任转送Request。
本篇将简单介绍下ASP.NET Core的URL重写(URL Rewrite)。

URL Rewrite 注册

URL Rewriting Middleware需要Microsoft.AspNetCore.Rewrite套件。
ASP.NET Core 2.0以上版本,预设是参考Microsoft.AspNetCore.All,已经包含Microsoft.AspNetCore.Rewrite,所以不用再安装。

要使用URL重写,在Startup.csConfigureIApplicationBuilder使用UseRewriter方法注册URL Rewriting Middleware:

Startup.cs

// ...
public class Startup
{
public void Configure(IApplicationBuilder app)
{
var rewrite = new RewriteOptions()
.AddRewrite("about.aspx", "home/about", skipRemainingRules: true)
.AddRedirect("first", "home/index");
app.UseRewriter(rewrite);
// ...
}
}

通过RewriteOptions建立URL重写规则后,传入给URL Rewriting Middleware。

URL重写规则,主要有分两种方式:

  • URL重写(URL Rewrite)
    上例的AddRewrite就是URL重写。
  • URL转址(URL Redirect)
    上例的AddRedirect就是URL转址。

URL 重写

URL 重写是属于Server 端的转换事件,当Client 端Request 来的时候,发现原网址已经被换掉了,就会自动回传新网址的内容。情境如下:

上例AddRewrite有用到三个参数,当URL符合参数1时,就将参数2路由的内容回传给Client。
参数3是用来加速URL匹配的参数,类似switch的break。若将skipRemainingRules设为true,当找到匹配条件,就不再继续往下找符合其他参数1的规则。

  • 参数1支持正则表达式(Regular Expressions)。

范例结果:

URL 转址

URL 转址是属于Client 端的转换事件,当Client 端Request 来的时候,发现原网址已经被换掉了,Server 会先回传给Client 告知新网址,再由Client 重新Request 新网址。情境如下:

AddRedirect的使用方式类似AddRewrite,当URL符合参数1时,就会回传参数2的URL给Client。

  • 参数1同样支持正则表达式(Regular Expressions)。

URL转址预设都是回传HTTP Status Code 302,也可以在参数3指定回传的HTTP Status Code。
通常转址的HTTP Status Code都是用301或302 ,URL转址对“人”的行为来说没有什么意义,反正就是帮忙从A转到B;主要差异是给“搜索引擎”理解的。

Startup.cs

// ...
public class Startup
{
public void Configure(IApplicationBuilder app)
{
var rewrite = new RewriteOptions()
.AddRedirect("first", "home/index", 301);
app.UseRewriter(rewrite);
// ...
}
}
  • HTTP Status Code 301 

301是要让搜索引擎知道,该网址已经永久转移到另一个地方。通常用于网站搬家或网站改版,新旧版本路径不相同,要重新对应的情况。

范例结果:

  • HTTP Status Code 302 

302是告知搜索引擎,虽然这次被转址,但只是暂时性的。通常用于网站维护时,暂时原网址转移到别的地方,如维护公告页面。
范例结果:

   

正则表达式

AddRewriteAddRedirect都支持正则表达式的使用,且能把来源的URL通过正则表达式变成参数,带入新URL。

Startup.cs

// ...
public class Startup
{
public void Configure(IApplicationBuilder app)
{
var rewrite = new RewriteOptions()
.AddRedirect(@"products.aspx?id=(\w+)", "prosucts/$1", 301)
.AddRedirect(@"api/(.*)/(.*)/(.*)", "api?p1=$1&p2=$2&p3=$3", 301);
app.UseRewriter(rewrite);
// ...
}
}
  • 当连到http://localhost:5000/products.aspx?id=p123
    转址到http://localhost:5000/products/p123
  • 当连到http://localhost:5000/api/first/second/third
    转址到http://localhost:5000/api?p1=first&p2=second&p3=third

通过正则表达式做URL 转址,对于网站新旧改版来说,非常好用。

参考

URL Rewriting Middleware in ASP.NET Core

老司机发车啦:https://github.com/SnailDev/SnailDev.NETCore2Learning

ASP.NET Core 2 学习笔记(八)URL重写的更多相关文章

  1. sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)

    sql server 关于表中只增标识问题   由于我们系统时间用的过长,数据量大,设计是采用自增ID 我们插入数据的时候把ID也写进去,我们可以采用 关闭和开启自增标识 没有关闭的时候 ,提示一下错 ...

  2. Asp.Net Core WebApi学习笔记(四)-- Middleware

    Asp.Net Core WebApi学习笔记(四)-- Middleware 本文记录了Asp.Net管道模型和Asp.Net Core的Middleware模型的对比,并在上一篇的基础上增加Mid ...

  3. ASP.NET Core 2 学习笔记(七)路由

    ASP.NET Core通过路由(Routing)设定,将定义的URL规则找到相对应行为:当使用者Request的URL满足特定规则条件时,则自动对应到相符合的行为处理.从ASP.NET就已经存在的架 ...

  4. ASP.NET Core 2 学习笔记(十三)Swagger

    Swagger也算是行之有年的API文件生成器,只要在API上使用C#的<summary />文件注解标签,就可以产生精美的线上文件,并且对RESTful API有良好的支持.不仅支持生成 ...

  5. ASP.NET Core 2 学习笔记(十二)REST-Like API

    Restful几乎已算是API设计的标准,通过HTTP Method区分新增(Create).查询(Read).修改(Update)和删除(Delete),简称CRUD四种数据存取方式,简约又直接的风 ...

  6. ASP.NET Core 2 学习笔记(十)视图

    ASP.NET Core MVC中的Views是负责网页显示,将数据一并渲染至UI包含HTML.CSS等.并能痛过Razor语法在*.cshtml中写渲染画面的程序逻辑.本篇将介绍ASP.NET Co ...

  7. ASP.NET Core 2 学习笔记(一)开始

    原文:ASP.NET Core 2 学习笔记(一)开始 来势汹汹的.NET Core似乎要取代.NET Framework,ASP.NET也随之发布.NET Core版本.虽然名称沿用ASP.NET, ...

  8. 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(八)-- 多环境开发

    本篇将演示Asp.Net Core如何在多环境下进行开发适配. 在一个正规的开发流程里,软件开发部署将要经过三个阶段:开发.测试.上线,对应了三个环境:开发.测试.生产.在不同的环境里,需要编写不同的 ...

  9. 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(四)-- Middleware

    本文记录了Asp.Net管道模型和Asp.Net Core的Middleware模型的对比,并在上一篇的基础上增加Middleware功能支持. 在演示Middleware功能之前,先要了解一下Asp ...

随机推荐

  1. PyQt5信号与槽

    简单使用 可以使用designer的一个模式定义,也可以自己定义,在__init__函数里,self.btn.clicked.connect(self.text.clear). 注意:槽不用加括号,可 ...

  2. Kuberentes-入门

    一.kubernetes架构介绍和集群规划 点击链接查看: 系统环境初始化:https://www.cnblogs.com/hwlong/p/9105742.html 二.CA证书创建和分发 点击链接 ...

  3. Linux之常用命令

    1.cd命令 这是一个非常基本,也是大家经常需要使用的命令,它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径.如: cd /root/Docements # 切换到 ...

  4. php单点登陆简单实现 (iframe方式)

    有四个网站分别为: www.a.com www.b.com www.c.com www.sso.com 需求是如果我们在sso登陆后,其他网站也会显示登陆中,不需要重复登陆,退出时,其他网站也会失效. ...

  5. MVC仓储类Repository

    接口: using Common; using System; using System.Collections; using System.Collections.Generic; using Sy ...

  6. Visual Studio宏

    MSVC++ 14.0 _MSC_VER == 1900 (Visual Studio 2015)MSVC++ 12.0 _MSC_VER == 1800 (Visual Studio 2013)MS ...

  7. 05 Maven 生命周期和插件

    Maven 生命周期和插件 除了坐标.依赖以及仓库之外, Maven 另外两个核心概念是生命周期和插件.在有关 Maven 的日常使用中,命令行的输入往往就对应了生命周期,如 mvn package ...

  8. 2013.7.15 非html 标签 ,外层 要用 ‘’

    当使用  非  html  标签 是 ,要使用 单引号  作外层 , 双引号 用单层 ,如 <s:if test='direction=="出"'>  可以执行 ,, ...

  9. source Insight工程的简单使用

    本文以管理虚拟机里面的uboot为例: 1.选择project->New project->选择工程路径,假设为D:\uboot:->project has its own conf ...

  10. part1:15-安装Linux系统到开发板

    1.Qtopia简介 Qtopia是Trolltech公司为采用嵌入式Linux操作系统的消费电子设备而开发的综合应用平台,Qtopia包含完整的应用层.灵活的界面用户.窗口操作系统.应用程序启动程序 ...