[譯]ASP.NET Core 2.0 網(wǎng)址重定向的方法
問題
如何在ASP.NET Core 2.0中實(shí)現(xiàn)網(wǎng)址重定向?
答案
新建一個(gè)空項(xiàng)目,在Startup.cs文件中,配置RewriteOptions參數(shù)并添加網(wǎng)址重定向中間件(UseRewriter):
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { var rewrite = new RewriteOptions() .AddRedirect("films", "movies") .AddRewrite("actors", "stars", true); app.UseRewriter(rewrite); app.Run(async (context) => { var path = context.Request.Path; var query = context.Request.QueryString; await context.Response.WriteAsync($"New URL: {path}{query}"); }); }
運(yùn)行,并在瀏覽器地址欄輸入:http://localhost:56825/films,通過客戶端調(diào)試工具觀察重定向過程:
在地址欄輸入:http://localhost:56825/actors,再次觀察重定向過程:
討論
網(wǎng)址重定向就是根據(jù)用戶自定義規(guī)則來修改請(qǐng)求的網(wǎng)址,目的是為了將服務(wù)器資源和瀏覽器網(wǎng)址解綁定。這樣做可能是出于安全考慮, 搜索引擎優(yōu)化(SEO),用戶友好網(wǎng)址,將HTTP重定向到HTTPS等多種目的。
當(dāng)你無法使用Web服務(wù)器(IIS,Apache,Nginx)的重定向功能時(shí),ASP.NET Core提供了一個(gè)可選項(xiàng) - 請(qǐng)求網(wǎng)址重定向中間件。然后它的性能和功能比不上Web服務(wù)器的重定向。
重定向中間件可以做兩件事情:客戶端重定向和服務(wù)器重寫:
重定向(客戶端)
這是一個(gè)客戶端操作,工作流程如下:
1. 客戶端請(qǐng)求一個(gè)資源,比如 /films
2. 服務(wù)器返回301(Moved Permanently)或者302(Found)狀態(tài)碼,并在響應(yīng)頭中添加Location屬性,用來指示瀏覽器請(qǐng)求新的地址(比如/movies)。
3. 客戶端請(qǐng)求新的地址,并顯示在瀏覽器的地址欄中。
重寫(服務(wù)端)
它是一個(gè)服務(wù)器端操作,工作流程如下:
1. 客戶端請(qǐng)求一個(gè)資源,比如 /actors
2. 服務(wù)器將其內(nèi)部映射到新的地址(比如/stars)并且返回200(OK)。
在此過程中,客戶端并不知道服務(wù)器端的內(nèi)部映射操作,因此用戶看到的瀏覽器地址欄依然顯示的是最初請(qǐng)求地址。
規(guī)則
重定向和重寫規(guī)則可以是正則表達(dá)式,更加詳細(xì)的信息請(qǐng)參考:https://docs.microsoft.com/en-gb/aspnet/core/fundamentals/url-rewriting
自定義重定向規(guī)則
我們也可以自定義重定向規(guī)則,通過一個(gè)繼承自IRule接口的類來實(shí)現(xiàn):
public class MoviesRedirectRule : IRule { private readonly string[] _matchPaths; private readonly string _newPath; public MoviesRedirectRule(string[] matchPaths, string newPath) { _matchPaths = matchPaths; _newPath = newPath; } public void ApplyRule(RewriteContext context) { var request = context.HttpContext.Request; // 已經(jīng)是目標(biāo)地址了,直接返回 if (request.Path.StartsWithSegments(new PathString(_newPath))) { return; } if (_matchPaths.Contains(request.Path.Value)) { var newLocation = $"{_newPath}{request.QueryString}"; var response = context.HttpContext.Response; response.StatusCode = StatusCodes.Status302Found; context.Result = RuleResult.EndResponse; response.Headers[HeaderNames.Location] = newLocation; } } }
然后在Configure()中,將此自定義規(guī)則添加到RewriteOptions里面:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { var rewrite = new RewriteOptions() .Add(new MoviesRedirectRule( matchPaths: new string[] { "/films", "/features", "/albums" }, newPath: "/movies")); app.UseRewriter(rewrite); app.Run(async (context) => { var path = context.Request.Path; var query = context.Request.QueryString; await context.Response.WriteAsync($"New URL: {path}{query}"); }); }
運(yùn)行,在地址欄輸入:http://localhost:56825/films?id=123,觀察重定向過程:
原文:https://tahirnaushad.com/2017/08/18/url-rewriting-in-asp-net-core/
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
ASP.Net WebAPI與Ajax進(jìn)行跨域數(shù)據(jù)交互時(shí)Cookies數(shù)據(jù)的傳遞
本文主要介紹了ASP.Net WebAPI與Ajax進(jìn)行跨域數(shù)據(jù)交互時(shí)Cookies數(shù)據(jù)傳遞的相關(guān)知識(shí)。具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-05-05MVC4制作網(wǎng)站教程第四章 部分欄目功能實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了MVC4制作網(wǎng)站教程,部分欄目功能實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08asp.net Application_AcquireRequestState事件,導(dǎo)致Ajax客戶端不能加載
項(xiàng)目中使用Application_AcquireRequestState事件,來做一些用戶信息的驗(yàn)證工作.2010-03-03Asp.net 在三層架構(gòu)中事務(wù)的使用實(shí)例代碼
再我知道的.net中,執(zhí)行事務(wù)有兩種方法,一種是自動(dòng)事物,使用起來相當(dāng)簡單,但是需要配置服務(wù)器,如果你用的是web共享主機(jī),即沒有權(quán)限配置自己的服務(wù)器,那就沒必要用這種了,接下了我講下.net中最普通的事務(wù)SqlTransaction2012-10-10asp.net(c#)有關(guān) Session 操作的幾個(gè)誤區(qū)
asp.net(c#)有關(guān) Session 操作的幾個(gè)誤區(qū)...2007-06-06asp.net 不用GridView自帶刪除功能,刪除一行數(shù)據(jù)
數(shù)據(jù)表一定要有個(gè)ID的主鍵值,你的gridview要設(shè)定一下DataKeyNames="ID"這個(gè)屬性值,接下的事件就好多了,寫個(gè)OnRowDeleting事件就可以了。2009-11-11用javascript css實(shí)現(xiàn)GridView行背景色交替、鼠標(biāo)劃過行變色,點(diǎn)擊行變色選中
前幾天在博問里發(fā)現(xiàn)有人問關(guān)于 GridView點(diǎn)擊行變色 的問題,突然想起很久很久以前,寫過一篇文章 一個(gè)簡單但常用的表格樣式--鼠標(biāo)劃過行變色--簡潔實(shí)現(xiàn) ,是關(guān)于表格行顏色交替和鼠標(biāo)指向時(shí)變色的,正好今天把那一篇補(bǔ)充和擴(kuò)展一下2008-09-09aspnet_isapi.dll設(shè)置圖文方法.net程序?qū)崿F(xiàn)偽靜態(tài)
aspnet_isapi.dll設(shè)置圖文介紹.net的程序?qū)崿F(xiàn)偽靜態(tài),需要的朋友可以參考下。2009-11-11