分享程式代碼相關筆記
目前文章總數:204 篇
最後更新:2025年 11月 01日
這邊以此網站為例資訊網站
一般情況下可以正常連線過去瀏覽
 
進入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的地方有出現友善的提示(正確網址)