[譯]ASP.NET Core 2.0 網(wǎng)址重定向的方法
問題
如何在ASP.NET Core 2.0中實現(xiàn)網(wǎ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}");
});
}
運行,并在瀏覽器地址欄輸入:http://localhost:56825/films,通過客戶端調(diào)試工具觀察重定向過程:

在地址欄輸入:http://localhost:56825/actors,再次觀察重定向過程:

討論
網(wǎng)址重定向就是根據(jù)用戶自定義規(guī)則來修改請求的網(wǎng)址,目的是為了將服務(wù)器資源和瀏覽器網(wǎng)址解綁定。這樣做可能是出于安全考慮, 搜索引擎優(yōu)化(SEO),用戶友好網(wǎng)址,將HTTP重定向到HTTPS等多種目的。
當你無法使用Web服務(wù)器(IIS,Apache,Nginx)的重定向功能時,ASP.NET Core提供了一個可選項 - 請求網(wǎng)址重定向中間件。然后它的性能和功能比不上Web服務(wù)器的重定向。
重定向中間件可以做兩件事情:客戶端重定向和服務(wù)器重寫:
重定向(客戶端)
這是一個客戶端操作,工作流程如下:
1. 客戶端請求一個資源,比如 /films
2. 服務(wù)器返回301(Moved Permanently)或者302(Found)狀態(tài)碼,并在響應(yīng)頭中添加Location屬性,用來指示瀏覽器請求新的地址(比如/movies)。
3. 客戶端請求新的地址,并顯示在瀏覽器的地址欄中。
重寫(服務(wù)端)
它是一個服務(wù)器端操作,工作流程如下:
1. 客戶端請求一個資源,比如 /actors
2. 服務(wù)器將其內(nèi)部映射到新的地址(比如/stars)并且返回200(OK)。
在此過程中,客戶端并不知道服務(wù)器端的內(nèi)部映射操作,因此用戶看到的瀏覽器地址欄依然顯示的是最初請求地址。
規(guī)則
重定向和重寫規(guī)則可以是正則表達式,更加詳細的信息請參考:https://docs.microsoft.com/en-gb/aspnet/core/fundamentals/url-rewriting
自定義重定向規(guī)則
我們也可以自定義重定向規(guī)則,通過一個繼承自IRule接口的類來實現(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)是目標地址了,直接返回
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}");
});
}
運行,在地址欄輸入:http://localhost:56825/films?id=123,觀察重定向過程:

原文:https://tahirnaushad.com/2017/08/18/url-rewriting-in-asp-net-core/
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
淺談ASP.NET Core 中jwt授權(quán)認證的流程原理
這篇文章主要介紹了淺談ASP.NET Core 中jwt授權(quán)認證的流程原理,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
ASP.NET 網(wǎng)站開發(fā)中常用到的廣告效果代碼
在ASP.NET項目開發(fā)中,會被要求添加廣告,有翻屏效果、有廣告輪流顯示、飄浮廣告、左側(cè)廣告、右側(cè)廣告等。2010-04-04
ASP.NET?Core6.0-wwwroot文件夾無法訪問解決方法
ASP.NET?Core項目中的wwwroot文件夾被視為Web根文件夾,本文主要介紹了ASP.NET?Core6.0-wwwroot文件夾無法訪問解決方法,具有一定的參考價值,感興趣的可以了解一下2024-09-09
ASP.NET Core 6.0 中使用Autofac的項目實踐
本文主要介紹了ASP.NET Core 6.0 中使用Autofac的項目實踐,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01
Silverlight融合ajax實現(xiàn)前后臺數(shù)據(jù)交互
兩年前Silverlight 還未起名,故事發(fā)生在WPF/E 的年代里。07年8月在中軟實習(xí)時,我承擔起了在. Net 中嵌入WPF/E 的任務(wù),目的是增強用戶體驗。2009-05-05
ASP.NET調(diào)用WebService服務(wù)的方法詳解
這篇文章主要介紹了ASP.NET調(diào)用WebService服務(wù)的方法,較為詳細的分析了WebService服務(wù)的功能,創(chuàng)建步驟與使用方法,需要的朋友可以參考下2016-05-05

