ASP.NET Core 2.2 基础知识(四) URL重写中间件_玖富娱


玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。

说到URL重写就不得不提URL重定向.

URL重定向

URL重定向是客户端操纵,指导客户端接见另一个地点的资本.这须要往复服务器,而且当客户端对资本发出要求时,返回客户端的重定向URL会出如今浏览器的地点栏中.

将要求重定向到分歧的URL时,可指导重定向是永远的照样暂时的.若是是永远的,则运用"301"状况码.收到"301"状况码时,客户端可能会缓存.若是是暂时的,则运用"302"状况码,以使客户端未来不该存储和重用重定向URL.

示例:

新建一个WebAPI项目;新增一个 TestController 控制器;在 Startup 类的 Configure 要领中增添以下代码:

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            ...other codes
            var options = new RewriteOptions();
        //options.AddRedirect("^redirect/(.*)", "api/test");//默许状况码为 302
            options.AddRedirect("^redirect/(.*)", "api/test", 301);
            app.UseRewriter(options);

            app.Run(async context =>
                {
                    //注重重定向和重写URL两种情况下,浏览器地点栏和页面显现的 URL 的区分.
                    await context.Response.WriteAsync($"URL:{context.Request.Path   context.Request.QueryString}"); });

            app.UseMvc();
        }

启动该项目,在浏览器地点栏输入 : https://localhost:44303/redirect/123 后,

 

能够看出,客户端一共要求了两次,浏览器地点栏变成了重定向的URL.

 

URL重写

URL重写是服务器端操纵.重写URL不须要往复服务器,重写的URL也不会返回客户端,也不会出如今浏览器地点栏.

示例:

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            ...other codes

            var options = new RewriteOptions();
            options.AddRewrite("^rewrite/(.*)", "api/test", true);//重写URL,false/true 透露表现若是以后划定规矩实用,是不是跳过其他重写划定规矩.           
            app.UseRewriter(options);

            app.Run(async context =>
                {
                    //注重重定向和重写URL两种情况下,浏览器地点栏和页面显现的 URL 的区分.
                    await context.Response.WriteAsync($"URL:{context.Request.Path   context.Request.QueryString}");
                });

            app.UseMvc();
        }
    }

 

在浏览器地点栏输入 : https://localhost:44303/rewrite/1

 

 

RewriteOptions 范例供应了许多重写和重定向的要领,除上述的 AddRedirect , AddRewrite 外,另有两个对照好玩的要领.

1.Add(Action<RewriteContext> applyRule)

吸收一个托付.当要求地点相符一个划定规矩后,要领通报的托付便会实行.这里以修正 reContext.Result 的值为例.示例:

-玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。-
            {
                RewriteOptions options = new RewriteOptions();
                options.AddRewrite("^rewrite*", "test", true).Add(reContext =>
                {
                    reContext.Result = RuleResult.EndResponse; });
                app.UseRewriter(options);
                app.Run(async context => { await context.Response.WriteAsync(context.Request.Path   context.Request.QueryString); });
            }

只要要求地点相符划定规矩时才会实行  app.Run(async context => { await context.Response.WriteAsync(context.Request.Path context.Request.QueryString); })  这句代码.

测试图以下:

 

能够看到,上面的要求不相符划定规矩,页面上甚么都没显现;下面的要求相符划定规矩,页面显现出了重写后的要求途径. 

2.AddRedirectToHttps

该要领能够将 HTTP 要求重定向到接纳 HTTPS 的雷同主机和途径.

新建一个 WebAPI 项目,然则不勾选  "为HTTPS设置装备摆设" 选项.

修正 Configure 要领. 

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            var options = new RewriteOptions();
            options.AddRedirectToHttps(statusCode: 301, sslPort: 9527); app.UseRewriter(options);
            app.UseMvc();
        }

在浏览器地点栏输入该项目地点 : http://localhost:50588 ,会重定向到 https://localhost:9527 , 如图.

 

 

上面一切重写的示例中,重写的划定规矩都是写在代码内里的,而ASP.NET Core 还供应了从文件中读取划定规矩的体式格局.

新建一个文件夹 Rule ,增加一个 IISUrlRewrite.xml 文件,内容以下:

<rewrite>
  <rules>
    <rule name="MyIISUrlRewrite" stopProcessing="true">
      <match url="^rewrite/(.*)"/>
      <!--还 没发明 appendQueryString = false 和 true 的区分-->     
      <action type="Rewrite" url="api/values/{R:1}" appendQueryString="false"/>
    </rule>
  </rules>
</rewrite>

修正 Configure 要领:

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            ......
            var options = new RewriteOptions();

            //要领一:
            //using (StreamReader sr = File.OpenText(Path.Combine(env.ContentRootPath, @"RuleIISUrlRewrite.xml")))
            //{
            //    options.AddIISUrlRewrite(sr);
            //    app.UseRewriter(options);
            //}

            //要领二:
            var fileProvider = new PhysicalFileProvider(Path.Combine(env.ContentRootPath, "Rule"));
            options.AddIISUrlRewrite(fileProvider, "IISUrlRewrite.xml");
            app.UseRewriter(options);


            app.Run(async context =>
                {
                    await context.Response.WriteAsync(context.Request.Path   context.Request.QueryString);
                });

            app.UseMvc();
        }

图就不上了.

 

 虽然还没用 ASP.NET Core 开发过任何项目,然则我以为下面这类重写和重定向的要领也许会是用得最多的,由于它充足天真.

 

    public class MyRule : IRule
    {
        //能够自定义组织函数,做一些考证
        //public MyRule(string extension, string newPath)
        //{
        //    if (string.IsNullOrEmpty(extension))
        //    {
        //        throw new ArgumentException(nameof(extension));
        //    }
        //    if (!Regex.IsMatch(extension, @"^rewrite*"))
        //    {
        //        throw new ArgumentException("Invalid extension", nameof(extension));
        //    }
        //    if (!Regex.IsMatch(newPath, @"(/[A-Za-z0-9] ) ?"))
        //    {
        //        throw new ArgumentException("Invalid path", nameof(newPath));
        //    }

        //    _extension = extension;
        //    _newPath = new PathString(newPath);
        //}

        //private readonly string _extension;
        //private readonly PathString _newPath;

        private readonly string _extension;
        private readonly string _newPath;
        public MyRule(string extension, string newPath)
        {
            _extension = extension;
            _newPath = newPath;
        }


        public void ApplyRule(RewriteContext context)
        {
            HttpRequest request = context.HttpContext.Request;
            HttpResponse response = context.HttpContext.Response;

            //能够重写
            request.Path = new PathString(_newPath);
            context.Result = RuleResult.SkipRemainingRules;

            //能够重定向
            //if (request.Path.Value.EndsWith(_extension, StringComparison.OrdinalIgnoreCase))
            //{
            //    response.StatusCode = StatusCodes.Status302Found;
            //    context.Result = RuleResult.EndResponse;
            //    response.Headers[HeaderNames.Location] = _newPath;
            //}
        }
    }

 

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseHsts();
            }

 RewriteOptions options = new RewriteOptions();
            options.Add(new MyRule("rewrite","/api/test")); app.UseRewriter(options);

            app.UseHttpsRedirection();
            app.UseMvc();
        }
    }

 

-玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。