[ASP.net MVC/WebForm] 取得真實的客戶端IP 方法

GetRealClientIP

自訂類別

using System;
using System.Web;

namespace MyProject.Utility
{
    /// <summary>
    /// Web 相關工具類別
    /// </summary>
    public static class MyWebUtility
    {
        /// <summary>
        /// 取得真實的客戶端IP(考慮CDN/代理情況)
        /// </summary>
        /// <param name="request">HTTP 請求物件</param>
        /// <returns>客戶端真實IP</returns>
        public static string GetRealClientIP(HttpRequestBase request)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            // 1. Cloudflare 特定標頭 (最優先)
            string cfConnectingIp = request.Headers["CF-Connecting-IP"];
            if (!string.IsNullOrEmpty(cfConnectingIp))
            {
                return cfConnectingIp;
            }

            // 2. X-Forwarded-For 標頭 (通用代理標頭)
            // 格式可能是: "client_ip, proxy1_ip, proxy2_ip"
            string xForwardedFor = request.Headers["X-Forwarded-For"];
            if (!string.IsNullOrEmpty(xForwardedFor))
            {
                // 取第一個 IP(真實客戶端 IP)
                string firstIp = xForwardedFor.Split(',')[0].Trim();
                if (!string.IsNullOrEmpty(firstIp))
                {
                    return firstIp;
                }
            }

            // 3. X-Real-IP 標頭 (某些反向代理使用)
            string xRealIp = request.Headers["X-Real-IP"];
            if (!string.IsNullOrEmpty(xRealIp))
            {
                return xRealIp;
            }

            // 4. 最後才使用直接連線的 IP
            return request.UserHostAddress;
        }
    }
}

在Action動作方法裡的使用

  public ActionResult MyAction()
  { 
       
     string userIP = MyWebUtility.GetRealClientIP(Request), //使用者IP(考慮CDN/代理情況)
     return Content($@"userIP:{userIP}");
    }