分享程式代碼相關筆記
目前文章總數:157 篇
最後更新:2024年 12月 07日
這邊以此網站為例資訊網站
一般情況下可以正常連線過去瀏覽
進入Windows Command (Bash、PowerShell也行),輸入以下Curl指令
接收到對方回傳 200 OK的提示
curl -I https://www.cpzhan.com/liu-he-cai/all-results
這次我們將Url最後面加上一個斜線 / 會出現301重定向的提示並且告知我們正確的URL該如何使用。
curl -I https://www.cpzhan.com/liu-he-cai/all-results/
本篇要說明,如何在Asp.net Core 實現如此友善的回傳方式
※回傳 Location: http://www.cpzhan.com/liu-he-cai/all-results
1. 控制器 | : | 調整HttpGet模擬liu-he-cai/all-results連結位址 |
2. 過濾器 | : | 檢核URL、重組正確的Loaction、回傳正確的HttpStatus |
HomeController.cs 新增以下Method,模擬出第一部分的 liu-he-cai/all-results 位址
using Microsoft.AspNetCore.Mvc;
using System.Diagnostics;
using WebRouterRuleExample.Models;
using WebRouterRuleExample.RouteRule;
namespace WebRouterRuleExample.Controllers
{
//... 其他略
public class HomeController : Controller
{
//1. 模擬對方網站的URL
[Route("liu-he-cai/all-results/{year?}")]
[EnsureTrailingSlash] // 2. 使用自訂義的動作過濾器
public IActionResult GetData(int? year)
{
// 在這裡編寫您的 API 邏輯,例如根據 year 取得資料 ...
return Ok("Data for ID: " + year);
}
}
}
建立一個資料夾RouteRule (路由規則),下方新增 EnsureTrailingSlashAttribute.cs
目的:實現給控制器掛載時,會處理路由(URL)的內容
public class EnsureTrailingSlashAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
var request = context.HttpContext.Request;
// 1. 檢查邏輯 - URL 是否以斜槓結尾
var isLegal = IsLegalUrlPath(request.Path.Value ?? string.Empty);
if (false == isLegal)
{
// 2. 組成正確的Url 回傳Location給對方知道
var path = context.HttpContext.Request.Path;
var pathSplit = request.Path.Value.Split('/');
var addPathList = new List<string>() { ""};
for (int index = 1; index < pathSplit.Length; index++)
{
if (string.IsNullOrEmpty(pathSplit[index]))
continue;
addPathList.Add(pathSplit[index]);
}
var queryString = context.HttpContext.Request.QueryString;
var pathFullUrl = string.Join('/', addPathList) + queryString;
var rightFullUrl = (context.HttpContext.Request.IsHttps ? "https://" : "http://")
+ context.HttpContext.Request.Host.ToString()
+ pathFullUrl;
// 3-1. 創建一個 RedirectResult 實現重定向301
var result = new RedirectResult(WebUtility.HtmlEncode(rightFullUrl), true);
// 3-2. 設定 HTTP 狀態碼為 301
context.HttpContext.Response.StatusCode = 301;
// 4. 設定 Location 標頭以指定重定向目標(就是我們建議的正確位置)
context.HttpContext.Response.Headers.Add("Location", WebUtility.HtmlEncode(rightFullUrl));
// 5. 將結果設定到結果中
context.Result = result;
base.OnActionExecuting(context);
}
base.OnActionExecuting(context);
}
/// <summary>
/// 檢核是否為合法的Url
/// </summary>
private static bool IsLegalUrlPath(string url)
{
var urlItem = url.Split('/');
if (!string.IsNullOrEmpty(urlItem[0]))
{
return false;
}
for (int index = 1; index < urlItem.Length; index++)
{
if (string.IsNullOrEmpty(urlItem[index]))
return false;
}
return true;
}
}
開啟範例專案代碼,啟動後,不動即可,當做Local Server
這邊本機的Server Host如下:
https://localhost:5093
因此測試代碼改為以下:
curl -I https://localhost:5093/liu-he-cai/all-results
可以看到因為輸入正確,回傳200 OK
接著我們要測試錯誤的URL,加上斜線 /
curl -I https://localhost:5093/liu-he-cai/all-results/
可以發現Location的地方有出現友善的提示(正確網址)