在 PHP 中獲取使用者 IP 地址

Subodh Poudel 2023年1月30日
PHP
  1. 在 PHP 中使用 $_SERVER['REMOTE_ADDR'] 查詢使用者的 IP 地址
  2. 使用 $_SERVER['REMOTE_ADDR']$_SERVER['HTTP_CLIENT_IP']$_SERVER['HTTP_X_FORWARDED_FOR'] 查詢使用者的 IP 地址
  3. 使用三元運算子和 isset() 函式查詢使用者的 IP 地址
在 PHP 中獲取使用者 IP 地址

我們將介紹一種使用 $_SERVER 超級全域性變數(唯一的陣列元素是 REMOTE_ADDR)從 PHP 伺服器中訪問使用者 IP 地址的方法。它用作 $_SERVER['REMOTE_ADDR']

我們將演示使用條件表示式檢查使用者 IP 地址是來自共享 Internet,代理還是真實 IP 地址,這是使用條件表示式訪問 PHP 使用者 IP 地址的另一種方法。該方法使用陣列元素,例如 HTTP_CLIENT_IPHTTP_X_FORWARDED_FORREMOTE_ADDR

我們將向你展示一種使用三元運算子和 isset() 函式在 PHP 中獲取使用者 IP 地址的簡便方法。此方法還使用超全域性變數 $_SERVER 中的陣列元素,例如 HTTP_CLIENT_IPHTTP_X_FORWARDED_FORREMOTE_ADDR

在 PHP 中使用 $_SERVER['REMOTE_ADDR'] 查詢使用者的 IP 地址

我們可以使用 $_SERVER['REMOTE_ADDR'] 表示式查詢使用者訪問當前頁面的 IP 地址。$_SERVER 是 PHP 中的超級全域性變數,它使用各種陣列元素作為引數。我們使用 REMOTE_ADDR 作為 $_SERVER 變數中的陣列元素來訪問客戶端的實際 IP 地址。注意,$_SERVER['REMOTE_ADDR'] 並不總是在所有情況下都提供正確的客戶端 IP 地址。我們將在下面討論其他情況。確保伺服器 API(SAPI)的配置正確,以便上面的表示式將返回連線的真實 IP。

在下面的示例中,localhost 用作伺服器。因此,它返回回送 IP 地址。要了解回送地址,請參考 here。假設以下 PHP 指令碼的 URL 是 http://localhost/index.php。它將本地計算機的 IP 地址輸出為::1::1localhost 的 IPv6 表示形式。

例如,將 $_SERVER['REMOTE_ADDR'] 分配給變數 ip_addr。然後,使用 echo 列印變數。

示例程式碼:

# php 7.x
<?php
$ip_add = $_SERVER['REMOTE_ADDR'];
echo "The user's IP address is - ".$ip_add;
?>

輸出:

The user's IP address is - ::1

使用 $_SERVER['REMOTE_ADDR']$_SERVER['HTTP_CLIENT_IP']$_SERVER['HTTP_X_FORWARDED_FOR'] 查詢使用者的 IP 地址

我們可以使用超全域性變數 $_SERVER 的陣列元素,例如 $_SERVER['REMOTE_ADDR']$_SERVER['HTTP_CLIENT_IP']$_SERVER['HTTP_X_FORWARDED_FOR'] 來查詢 IP 地址 PHP 中的使用者。使用 $_SERVER['REMOTE_ADDR'] 查詢使用者的真實 IP 地址。當使用者從共享 Internet 訪問頁面時,使用 $_SERVER['HTTP_CLIENT_IP'] 查詢 IP 地址。當使用者使用代理訪問網頁時,使用 $_SERVER['HTTP_X_FORWARDED_FOR'] 查詢 IP 地址。請注意,諸如 HTTP_X_FORWARDED_FORHTTP_CLIENT_IP 之類的標頭可能是偽造的,因為任何人都可以設定。有時,它們可能不代表客戶端的真實 IP 地址。

例如,使用 empty() 函式檢查 $_SERVER['HTTP_CLIENT_IP'] 是否包含某些內容。如果包含,則在 $ip 變數中分配 vale 並列印 i。
再次,相應地檢查 $_SERVER['HTTP_X_FORWARDED_FOR'],並分配該值並列印(如果存在)。在 $_SERVER['REMOTE_ADDR'] 上執行類似的操作。

下例 $_SERVER['REMOTE_ADDR'] 返回 IP 地址,因為使用者未使用任何代理或共享的 Internet 連線。檢視 PHP 手冊,以瞭解有關 $_SERVER 陣列的更多資訊。

示例程式碼:

#php 7.x
<?php if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    echo $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    echo $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    echo $ip = $_SERVER['REMOTE_ADDR'];
}
?> 

輸出:

 ::1

使用三元運算子和 isset() 函式查詢使用者的 IP 地址

我們可以使用簡寫方法使用三元運算子在 PHP 中查詢使用者的 IP 地址。在此方法中,isset() 方法檢查陣列是否包含指定的元素或標頭檔案。

例如,使用 isset() 函式檢查陣列是否包含 HTTP_CLIENT_IP。如果條件為真,則設定 HTTP_CLIENT_IP。然後,如果條件失敗,則使用 isset() 函式檢查陣列是否包含 HTTP_X_FORWARDED_FOR。同樣,如果條件為真,則設定 HTTP_X_FORWARDED_FOR,並在條件失敗時設定 REMOTE_ADDR

在下面的示例中,客戶端未使用代理或共享 Internet。因此,將執行 $_SERVER['REMOTE_ADDR']。請檢視 MSDN Web 文件以瞭解有關三元運算子。

示例程式碼:

#php 7.x
<?php
$ip = isset($_SERVER['HTTP_CLIENT_IP']) ? $_SERVER['HTTP_CLIENT_IP'] : isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];
echo "The user IP Address is - ". $ip;
?>

輸出:

The user IP Address is - ::1
作者: Subodh Poudel
Subodh Poudel avatar Subodh Poudel avatar

Subodh is a proactive software engineer, specialized in fintech industry and a writer who loves to express his software development learnings and set of skills through blogs and articles.

LinkedIn