首頁

目前文章總數:157 篇

  

最後更新:2024年 12月 07日

0050. .Net Core 如何實現重定向301,友善提示回傳轉跳正確網址的方法

日期:2023年 09月 30日

標籤: C# Asp.net Core Web MVC Web Linux CentOS

摘要:C# 學習筆記


應用所需:1. Visual Studio 2022
範例檔案:範例檔案
解決問題:1. 當網站網址異動時,如何友善提示對方網址更改,並提供正確的URL
基本介紹:本篇分為三大部分。
第一部分:前言-出現301的狀況
第二部分:代碼架構
第三部分:Demo結果






第一部分:前言-出現301的狀況

Step 1:連結到一個網站

這邊以此網站為例資訊網站
一般情況下可以正常連線過去瀏覽


Step 2:Curl模擬-正確

進入Windows Command (Bash、PowerShell也行),輸入以下Curl指令
接收到對方回傳 200 OK的提示

curl -I https://www.cpzhan.com/liu-he-cai/all-results




Step 3:Curl模擬-重定向

這次我們將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




第二部分:代碼架構

Step 1:範例專案架構


1. 控制器 調整HttpGet模擬liu-he-cai/all-results連結位址
2. 過濾器 檢核URL、重組正確的Loaction、回傳正確的HttpStatus




Step 2:控制器

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);
        }
    }
}



Step 3:過濾器

建立一個資料夾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;
    }
}





第三部分:Demo結果

Step 1:執行範例專案

開啟範例專案代碼,啟動後,不動即可,當做Local Server


Step 2:Curl Demo-正確

這邊本機的Server Host如下:

https://localhost:5093


因此測試代碼改為以下:

curl -I https://localhost:5093/liu-he-cai/all-results


可以看到因為輸入正確,回傳200 OK




Step 3:Curl Demo-重定向

接著我們要測試錯誤的URL,加上斜線 /

curl -I https://localhost:5093/liu-he-cai/all-results/


可以發現Location的地方有出現友善的提示(正確網址)