首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP.NET Request.ServerVariables 完整參考:常用伺服器變數與用法

     編輯:ASP.NET 基礎

前言

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 基本驗證時的密碼(極少用,敏感) ******

實務常用場景與程式碼

1. 取得真實用戶 IP(支援 Proxy/Load Balancer)


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

2. 判斷是否為 HTTPS


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

3. 取得完整請求 URL(含 QueryString)


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

4. 記錄瀏覽器與作業系統


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

5. 取得應用程式實體路徑(替代 Server.MapPath)


string physicalPath = HttpContext.Current.Request.ServerVariables["APPL_PHYSICAL_PATH"];
// 等同於 HttpRuntime.AppDomainAppPath

注意事項與陷阱

  1. 大小寫不敏感:Request.ServerVariables["REMOTE_ADDR"] 與 ["remote_addr"] 相同。
  2. 代理伺服器隱藏真實 IP:一定要檢查 HTTP_X_FORWARDED_FOR、HTTP_X_REAL_IP,並信任已知代理 IP 範圍。
  3. HTTP_REFERER 可偽造/缺失:不可作為安全決策依據(如 CSRF 防護請用 AntiForgeryToken)。
  4. USER_AGENT 解析複雜:請使用成熟函式庫(UAParser、DeviceDetector.NET),勿自行 Regex。
  5. IIS 設定影響可用性:某些變數需啟用對應模組(如 HTTP_X_FORWARDED_FOR 需 ARR/URL Rewrite 設定)。
  6. 效能:ServerVariables 集合存取較慢,高頻呼叫請快取到區域變數。

ASP.NET Core 對應方式

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(查詢字串)。
  • 實務上務必處理代理 IP、HTTPS 判斷、UA 解析等邊界情況。
  • 遷移至 ASP.NET Core 時,改用 HttpContext.Request 強型別屬性與 Headers 集合。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved