• 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

  • 相关阅读:
    maven3自定义archetype
    Struts2传参碰到的奇怪问题
    easyui1.2.6 validate输入框验证在火狐下的一个bug
    easyui+ztree 后台管理系统模板
    html table中单元格自动换行
    windows重装后,不重装oracle,直接恢复数据库
    Debug---Eclipse断点调试基础
    Spring3 MVC请求参数获取的几种方法[转载]
    jQuery插件之ajaxFileUpload[转载]
    Spring MVC 3.0 深入及对注解的详细讲解[转载]
  • 原文地址:https://www.cnblogs.com/snaildev/p/9103801.html
Copyright © 2020-2023  润新知