路由跟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. php页面的基本语法

    概述: 1. PHP 脚本在服务器上执行,然后将纯 HTML 结果发送回浏览器. 2. PHP 脚本以 <?php 开始,以 ?> 结束,可以放到文档中的任何位置. 3. 当 PHP 解析 ...

  2. BroadcastReceiver接收电量变化的广播-------在代码中动态创建接受者

    本例为动态创建广播接收者即不是在AndroidManifest.xml文件中定义的广播接收着 代码: package com.qf.broadcastreceiver01; import androi ...

  3. linux-centos6-rabbitmq安装及配置

    服务器版本centos6.8 一.先安装Erlang 具体安装哪个版本可以对照 http://www.rabbitmq.com/which-erlang.html 如下图: 准备安装RabbitMQ3 ...

  4. 一名优秀的UI设计师应该具备哪些条件?

    想做好一个好的UI设计师除了应该具有一定的审美能力,还要了解整个产品的开发过程,因为目前国内的软件行业还不能对UI设计形成应有的重视度,所以对我们的要求就更高了,你要能作出夺人眼球的东西,还要站在用户 ...

  5. 原生JS 实现元素排序

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. 什么是tcp协议?

    这是世界上最顶尖的tcp讲解技术...

  7. connect strings sql server

    https://www.connectionstrings.com/sql-server/ Server=myServerAddress[,port];Database=myDataBase;User ...

  8. 2018.08.28 洛谷P3803 【模板】多项式乘法(FFT)

    传送门 fft模板题. 终于学会fft了. 这个方法真是神奇! 经过试验发现手写的complex快得多啊! 代码: #include<iostream> #include<cstdi ...

  9. 31. The New Bread Earners 挣钱养家的新军

    31. The New Bread Earners 挣钱养家的新军 ① They call them the new bread earners.They are women,and they are ...

  10. Fortran 语法之流程控制

    -----------------------