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