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

PHP 取得完整當前頁面 URL:協議、域名、路徑與查詢參數完整解析

     編輯:PHP 相關知識

從 $_SERVER 組合完整 URL

PHP 沒有內建「取得當前完整 URL」的單一函數,需從 $_SERVER 超全域陣列組合。本文詳細拆解各元件來源、注意事項與最佳實踐。

關鍵 $_SERVER 變數對照表

變數說明範例值
HTTPS非空值表示 HTTPS(Apache 為 'on',Nginx 需額外設定)'on' / ''
SERVER_PROTOCOL協議版本'HTTP/1.1'
HTTP_HOST客戶端送來的 Host 標頭(含 port,若非標準埠)'example.com' / 'example.com:8080'
SERVER_NAME伺服器設定的主機名(需啟用 UseCanonicalName On)'example.com'
SCRIPT_NAME當前執行腳本路徑(相對 DocumentRoot)'/index.php'
REQUEST_URI完整請求 URI(含查詢字串)'/index.php?page=2&sort=desc'
QUERY_STRING查詢字串(不含 ?)'page=2&sort=desc'
SERVER_PORT伺服器埠號80 / 443 / 8080

標準組合函數(支援 HTTP/HTTPS、非標準埠、子目錄)

function getCurrentUrl(): string {
    $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
    $host     = $_SERVER['HTTP_HOST'] ?? ($_SERVER['SERVER_NAME'] ?? 'localhost');
    $uri      = $_SERVER['REQUEST_URI'] ?? '/';
    return $protocol . '://' . $host . $uri;
}

// 使用範例
echo getCurrentUrl();
// 輸出:https://example.com:8080/path/to/script.php?foo=bar

進階拆解:各元件獨立取得

// 1. 協議
$protocol = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') ? 'https' : 'http';

// 2. 域名(優先 HTTP_HOST,含 port)
$host = $_SERVER['HTTP_HOST'] ?? $_SERVER['SERVER_NAME'] ?? 'localhost';

// 3. 腳本路徑(不含查詢字串)
$script = $_SERVER['SCRIPT_NAME'] ?? '';

// 4. 查詢字串
$query = $_SERVER['QUERY_STRING'] ?? '';

// 5. 組合完整 URL
$fullUrl = $protocol . '://' . $host . $script . ($query ? '?' . $query : '');

// 6. 替代方案:直接用 REQUEST_URI(含查詢字串)
$fullUrlAlt = $protocol . '://' . $host . ($_SERVER['REQUEST_URI'] ?? '/');

常見陷阱與解決方案

  • 反向代理/負載平衡器:真實協議可能在 HTTP_X_FORWARDED_PROTO,真實 IP 在 HTTP_X_FORWARDED_FOR。需信任代理標頭並在 Web 伺服器層設定 SetEnvIf X-Forwarded-Proto https HTTPS=on(Apache)或 proxy_set_header X-Forwarded-Proto $scheme;(Nginx)。
  • 非標準埠號:HTTP_HOST 已包含埠號(如 example.com:8080),無需額外處理 SERVER_PORT。
  • URL 重寫:SCRIPT_NAME 固定為實體腳本(如 /index.php),REQUEST_URI 反映使用者看到的虛擬路徑(如 /article/123),分頁/ canonical 應用 REQUEST_URI。
  • PHP_SELF 安全性:$_SERVER['PHP_SELF'] 可能包含路徑資訊(/index.php/),輸出至 HTML 時必須 htmlspecialchars()。

實用工具函數庫

class UrlHelper {
    public static function current(): string {
        return self::build(
            self::protocol(),
            self::host(),
            $_SERVER['REQUEST_URI'] ?? '/'
        );
    }

    public static function protocol(): string {
        return (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
    }

    public static function host(): string {
        return $_SERVER['HTTP_HOST'] ?? $_SERVER['SERVER_NAME'] ?? 'localhost';
    }

    public static function path(): string {
        return $_SERVER['SCRIPT_NAME'] ?? '/';
    }

    public static function query(): string {
        return $_SERVER['QUERY_STRING'] ?? '';
    }

    public static function build(string $protocol, string $host, string $uri): string {
        return $protocol . '://' . $host . $uri;
    }

    // 產生相對路徑(供表單 action、AJAX url 使用)
    public static function relative(): string {
        return $_SERVER['REQUEST_URI'] ?? '/';
    }

    // 移除指定查詢參數
    public static function withoutQueryParams(array $keys): string {
        $params = [];
        parse_str($_SERVER['QUERY_STRING'] ?? '', $params);
        foreach ($keys as $k) unset($params[$k]);
        $base = self::path();
        return $params ? $base . '?' . http_build_query($params) : $base;
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved