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

PHP $_SERVER 超全局變數完整指南:從基礎應用到代理穿透實戰

     編輯:PHP 相關知識

前言

$_SERVER 是 PHP 核心超全局變數,包含請求、服務器、腳本運行環境等關鍵信息。本文系統整理所有鍵值含義,重點解析 HTTP_X_FORWARDED_HOST 代理穿透實戰應用。

一、核心變數分類速查表

1. 腳本與請求基礎信息

鍵名含義示例
PHP_SELF當前執行腳本文件名(相對文檔根目錄)/index.php
argv傳遞給腳本的參數(CLI 模式)Array([0]=>arg1)
argc命令行參數個數2
REQUEST_METHOD請求方法GET、POST、PUT、HEAD
QUERY_STRING查詢字串id=1&name=test
REQUEST_URI訪問 URI/index.html?param=value
SCRIPT_FILENAME當前執行腳本絕對路徑/var/www/html/index.php
SCRIPT_NAME當前腳本路徑(自指向表單提交常用)/index.php

2. 服務器與協議信息

鍵名含義示例
GATEWAY_INTERFACECGI 規範版本CGI/1.1
SERVER_PROTOCOL通信協議名稱版本HTTP/1.1
SERVER_NAME服務器主機名example.com
SERVER_SOFTWARE服務器標識字串Apache/2.4.41
SERVER_PORT服務器端口80、443
SERVER_ADMIN管理員信息admin@example.com
SERVER_SIGNATURE服務器版本與虛擬主機名Apache/2.4.41 (Ubuntu)

3. 客戶端與請求頭信息

鍵名含義示例
HTTP_ACCEPTAccept 頭內容text/html,application/xhtml+xml
HTTP_ACCEPT_CHARSETAccept-Charset 頭utf-8,iso-8859-1
HTTP_ACCEPT_ENCODINGAccept-Encoding 頭gzip, deflate
HTTP_ACCEPT_LANGUAGEAccept-Language 頭zh-CN,zh;q=0.9
HTTP_CONNECTIONConnection 頭Keep-Alive
HTTP_HOSTHost 頭(含端口)example.com:8080
HTTP_REFERER來源頁面 URLhttps://google.com/search?q=php
HTTP_USER_AGENT用戶代理字串Mozilla/5.0...
HTTPSHTTPS 訪問標識on(HTTPS)/ off(HTTP)

4. 客戶端網絡信息

鍵名含義示例
REMOTE_ADDR客戶端 IP192.168.1.100
REMOTE_HOST客戶端主機名client.example.com
REMOTE_PORT客戶端連接端口54321

5. HTTP 認證相關(Apache 模塊模式)

鍵名含義
PHP_AUTH_USERHTTP 認證用戶名
PHP_AUTH_PWHTTP 認證密碼
AUTH_TYPE認證類型(Basic/Digest)

二、重點實戰:HTTP_X_FORWARDED_HOST 代理穿透

1. 背景問題

通過代理/CDN/負載均衡訪問時,REMOTE_ADDR 獲取到的是代理 IP,非真實客戶端 IP。

2. 關鍵變數對比

變數含義可信度
HTTP_X_FORWARDED_FOR客戶端真實 IP 鏈(可能多個,逗號分隔)中(可偽造)
HTTP_X_FORWARDED_HOST原始訪問的 Host(域名/IP)中
HTTP_X_REAL_IPNginx 代理常用,真實客戶端 IP高(需代理配置)
HTTP_CLIENT_IP某些代理使用低

3. 獲取真實 IP 最佳實踐

<?php
function getRealClientIp() {
    $ipKeys = [
        'HTTP_X_REAL_IP',        // Nginx 代理首選
        'HTTP_X_FORWARDED_FOR',  // 標準代理頭
        'HTTP_CLIENT_IP',        // 部分代理
        'REMOTE_ADDR'            // 直連或兜底
    ];
    
    foreach ($ipKeys as $key) {
        if (!empty($_SERVER[$key])) {
            // X-Forwarded-For 可能包含多個 IP,取第一個
            $ips = explode(',', $_SERVER[$key]);
            return trim($ips[0]);
        }
    }
    return 'unknown';
}

// 獲取原始 Host(含代理情況)
$host = isset($_SERVER['HTTP_X_FORWARDED_HOST']) 
    ? $_SERVER['HTTP_X_FORWARDED_HOST'] 
    : (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '');
?>

4. 安全警示

  • 不可完全信任:HTTP 頭可被客戶端偽造
  • 需配合代理配置:Nginx proxy_set_header X-Real-IP $remote_addr;
  • 內網環境優先:僅在可信代理鏈路中使用
  • 日誌記錄雙重記錄:同時記錄 REMOTE_ADDR 和解析出的真實 IP

三、文檔根目錄與路徑處理

<?php
// 文檔根目錄(Apache DocumentRoot)
$docRoot = $_SERVER['DOCUMENT_ROOT'];  // /var/www/html

// 當前腳本文件系統路徑(非文檔根目錄)
$pathTranslated = $_SERVER['PATH_TRANSLATED'];  // /var/www/html/index.php

// 當前腳本 URL 路徑
$scriptName = $_SERVER['SCRIPT_NAME'];  // /index.php
?>

四、調試技巧:快速查看所有 $_SERVER

<?php
echo '<pre>';
print_r($_SERVER);
echo '</pre>';
// 或僅顯示鍵名
echo implode(', ', array_keys($_SERVER));
?>

掌握 $_SERVER 細節,能精準處理路由、代理穿透、安全防禦、多環境部署等核心場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved