ASP.NET Core 2 学习笔记(八)URL重写

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

路由跟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

目录
相关文章
|
3月前
|
开发框架 前端开发 JavaScript
盘点72个ASP.NET Core源码Net爱好者不容错过
盘点72个ASP.NET Core源码Net爱好者不容错过
71 0
|
3月前
|
开发框架 .NET
ASP.NET Core NET7 增加session的方法
ASP.NET Core NET7 增加session的方法
37 0
|
3月前
|
开发框架 JavaScript .NET
ASP.NET Core的超级大BUG
ASP.NET Core的超级大BUG
42 0
|
5月前
|
开发框架 NoSQL .NET
ASP.NET Core开发者指南(2022版路线图)
ASP.NET Core开发者指南(2022版路线图)
72 0
ASP.NET Core开发者指南(2022版路线图)
|
6月前
|
开发框架 .NET Linux
ASP.NET Core 使用记录1
ASP.NET 项目启动 提示 ID为XXX的进程未启动原因:暂时不能明确。 解决方案:删除项目的 csproj 文件的WebProjectProperties节点内容。 <WebProjectProperties> <UseIIS>True</UseIIS> <AutoAssignPort>True</AutoAssignPort> ...
35 0
ASP.NET Core 使用记录1
|
3月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
42 0
|
1月前
|
JavaScript Windows
VUE部署到IIS中报404错误解决方案-配置URL重写
VUE部署到IIS中报404错误解决方案-配置URL重写
|
1月前
|
开发框架 中间件 .NET
C# .NET面试系列七:ASP.NET Core
## 第一部分:ASP.NET Core #### 1. 如何在 controller 中注入 service? 在.NET中,在ASP.NET Core应用程序中的Controller中注入服务通常使用<u>依赖注入(Dependency Injection)</u>来实现。以下是一些步骤,说明如何在Controller中注入服务: 1、创建服务 首先,确保你已经在应用程序中注册了服务。这通常在Startup.cs文件的ConfigureServices方法中完成。例如: ```c# services.AddScoped<IMyService, MyService>(); //
65 0
|
6月前
|
开发框架 .NET Linux
ASP.NET Core部署到linux(CentOS)
ASP.NET Core部署到linux(CentOS)
160 0
ASP.NET Core部署到linux(CentOS)
|
6月前
|
XML 开发框架 .NET
ASP.NET Core 使用记录3
解决Visual Studio报错 NETSDK1152: 找到了多个具有相同相对路径的发布输出文件原因:是项目多层引用(a引用了b、c,d引用了a、b、c),且被引用的项目生成了xml文件,发布时导致xml文件重复 ,但.net 6.0下会触发报错。解决:被引用项目不要生成xml文件【根本原因】;发布时,将C:\Program Files\dotnet\sdk\6.x的sdk移出C:\P...
52 0