Request.ServerVariables 集合提供 IIS 伺服器環境變數的存取,涵蓋用戶端 IP、瀏覽器資訊、請求標頭、伺服器設定等。本文整理最常用的鍵值、說明、範例輸出與實務應用場景,並提供 C# 擴充方法方便呼叫。
| 類別 | 鍵名 | 說明 | 範例值 |
|---|---|---|---|
| 客戶端識別 | REMOTE_ADDR | 用戶端 IP 位址 | 192.168.1.100 |
| REMOTE_HOST | 用戶端主機名稱(需 DNS 反向查詢) | client.example.com | |
| HTTP_X_FORWARDED_FOR | 代理/負載平衡轉發的原始 IP(可能多個,逗號分隔) | 203.0.113.195, 198.51.100.1 | |
| HTTP_USER_AGENT | 瀏覽器完整 User-Agent 字串 | Mozilla/5.0 (Windows NT 10.0; Win64; x64)... | |
| 請求資訊 | REQUEST_METHOD | HTTP 方法 | GET, POST, PUT, DELETE |
| QUERY_STRING | 查詢字串(不含 ?) | id=123&category=books | |
| HTTP_REFERER | 來源頁面 URL(用戶端可偽造) | https://google.com/search?q=asp.net | |
| CONTENT_TYPE | 請求內容類型 | application/x-www-form-urlencoded | |
| 伺服器資訊 | SERVER_NAME | 伺服器主機名稱/DNS | www.example.com |
| LOCAL_ADDR | 伺服器接收請求的本地 IP | 10.0.0.5 | |
| SERVER_PORT | 伺服器接聽埠 | 80, 443, 8080 | |
| SERVER_PORT_SECURE | 是否為安全埠 (HTTPS) | 1 (是) / 0 (否) | |
| 路徑資訊 | SCRIPT_NAME | 虛擬路徑(含應用程式路徑) | /MyApp/Page.aspx |
| PATH_INFO | 額外路徑資訊(ASP.NET 路由常用) | /api/products/123 | |
| APPL_PHYSICAL_PATH | 應用程式實體磁碟路徑 | C:\inetpub\wwwroot\MyApp\ | |
| SSL/憑證 | HTTPS | 是否為 HTTPS 連線 | on / off |
| HTTPS_KEYSIZE | SSL 金鑰長度 | 128, 256 | |
| HTTPS_SECRETKEYSIZE | 伺服器憑證私鑰長度 | 2048 | |
| 驗證/授權 | AUTH_USER | 通過驗證的使用者名稱 | DOMAIN\username |
| AUTH_TYPE | 驗證方式 | Basic, NTLM, Kerberos, Forms | |
| AUTH_PASSWORD | 基本驗證時的密碼(極少用,敏感) | ****** |
public static string GetClientIp(this HttpRequest request)
{
// 1. 標準代理標頭
string ip = request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (!string.IsNullOrEmpty(ip))
{
// 可能包含多個 IP,取第一個非私有 IP
foreach (var part in ip.Split(','))
{
var trimmed = part.Trim();
if (IsPublicIp(trimmed)) return trimmed;
}
}
// 2. 直接連線
return request.ServerVariables["REMOTE_ADDR"] ?? request.UserHostAddress;
}
private static bool IsPublicIp(string ip)
{
if (System.Net.IPAddress.TryParse(ip, out var addr))
{
var bytes = addr.GetAddressBytes();
// 簡易私有 IP 範圍判斷
if (bytes[0] == 10) return false;
if (bytes[0] == 172 && bytes[1] >= 16 && bytes[1] <= 31) return false;
if (bytes[0] == 192 && bytes[1] == 168) return false;
if (bytes[0] == 127) return false; // loopback
return true;
}
return false;
}
public static bool IsHttps(this HttpRequest request)
{
return string.Equals(request.ServerVariables["HTTPS"], "on", StringComparison.OrdinalIgnoreCase)
|| request.ServerVariables["SERVER_PORT_SECURE"] == "1"
|| request.Url.Scheme == "https";
}
public static string GetRawUrl(this HttpRequest request)
{
// 較 Request.RawUrl 可靠,避免重寫模組干擾
string url = request.ServerVariables["URL"]; // /app/page.aspx
string qs = request.ServerVariables["QUERY_STRING"];
return string.IsNullOrEmpty(qs) ? url : url + "?" + qs;
}
public static (string Browser, string OS) ParseUserAgent(string ua)
{
// 實務建議使用 UAParser 套件 (NuGet: UAParser)
// 這裡僅示範簡易關鍵字判斷
ua = ua?.ToLower() ?? "";
string browser = "Unknown", os = "Unknown";
if (ua.Contains("edg/")) browser = "Edge";
else if (ua.Contains("chrome")) browser = "Chrome";
else if (ua.Contains("firefox")) browser = "Firefox";
else if (ua.Contains("safari")) browser = "Safari";
else if (ua.Contains("msie") || ua.Contains("trident")) browser = "IE";
if (ua.Contains("windows nt 10.0")) os = "Windows 10/11";
else if (ua.Contains("windows nt 6.3")) os = "Windows 8.1";
else if (ua.Contains("windows nt 6.1")) os = "Windows 7";
else if (ua.Contains("mac os x")) os = "macOS";
else if (ua.Contains("android")) os = "Android";
else if (ua.Contains("ios") || ua.Contains("iphone")) os = "iOS";
else if (ua.Contains("linux")) os = "Linux";
return (browser, os);
}
string physicalPath = HttpContext.Current.Request.ServerVariables["APPL_PHYSICAL_PATH"];
// 等同於 HttpRuntime.AppDomainAppPath
Request.ServerVariables["REMOTE_ADDR"] 與 ["remote_addr"] 相同。HTTP_X_FORWARDED_FOR、HTTP_X_REAL_IP,並信任已知代理 IP 範圍。HTTP_X_FORWARDED_FOR 需 ARR/URL Rewrite 設定)。ServerVariables 集合存取較慢,高頻呼叫請快取到區域變數。ASP.NET Core 不使用 ServerVariables,改用 HttpContext.Request 屬性:
| 傳統鍵名 | ASP.NET Core 存取方式 |
|---|---|
| REMOTE_ADDR | HttpContext.Connection.RemoteIpAddress |
| HTTP_USER_AGENT | HttpContext.Request.Headers["User-Agent"] |
| HTTP_REFERER | HttpContext.Request.Headers["Referer"] |
| SERVER_NAME | HttpContext.Request.Host.Host |
| HTTPS | HttpContext.Request.IsHttps |
| QUERY_STRING | HttpContext.Request.QueryString.Value |
| APPL_PHYSICAL_PATH | IWebHostEnvironment.ContentRootPath |
protected void Page_Load(object sender, EventArgs e)
{
var sb = new System.Text.StringBuilder();
foreach (string key in Request.ServerVariables)
{
sb.AppendLine($"{key} = {Request.ServerVariables[key]}");
}
Response.Write("" + Server.HtmlEncode(sb.ToString()) + "
");
}
Request.ServerVariables 是 ASP.NET 存取 IIS 伺服器變數的主要管道,涵蓋網路、請求、伺服器、SSL、驗證等面向。REMOTE_ADDR(IP)、HTTP_USER_AGENT(UA)、HTTP_REFERER(來源)、REQUEST_METHOD(方法)、QUERY_STRING(查詢字串)。HttpContext.Request 強型別屬性與 Headers 集合。