function getClientIp(): string
{
$headers = [
'HTTP_CLIENT_IP',
'HTTP_X_FORWARDED_FOR',
'HTTP_X_FORWARDED',
'HTTP_X_CLUSTER_CLIENT_IP',
'HTTP_FORWARDED_FOR',
'HTTP_FORWARDED',
'REMOTE_ADDR'
];
foreach ($headers as $header) {
if (isset($_SERVER[$header])) {
$ips = array_map('trim', explode(',', $_SERVER[$header]));
foreach ($ips as $ip) {
if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
return $ip;
}
}
}
}
return $_SERVER['REMOTE_ADDR'] ?? 'unknown';
}
| Header | 來源 | 可信度 |
|---|---|---|
HTTP_CLIENT_IP | 部分代理伺服器 | 中 |
HTTP_X_FORWARDED_FOR | 標準代理/負載平衡器 (格式: client, proxy1, proxy2) | 高 (需信任代理) |
REMOTE_ADDR | 直接連線 IP (或最後一層代理) | 基準 |
X-Forwarded-For10.x, 172.16-31.x, 192.168.x, 127.x, 169.254.x// Laravel: 設定 trusted proxies
// app/Http/Middleware/TrustProxies.php
protected $proxies = '*'; // 或具體 IP 陣列
protected $headers = Request::HEADER_X_FORWARDED_FOR | Request::HEADER_X_FORWARDED_HOST | Request::HEADER_X_FORWARDED_PORT | Request::HEADER_X_FORWARDED_PROTO;
// 控制器中直接使用
$ip = $request->ip(); // 自動處理信任代理
// Symfony: framework.yaml
framework:
trusted_proxies: '192.168.0.0/16,10.0.0.0/8'
trusted_headers: ['x-forwarded-for', 'x-forwarded-host']
if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) {
// Cloudflare 保證真實性
return $_SERVER['HTTP_CF_CONNECTING_IP'];
}
原文附有 register_globals=off 相容代碼,PHP 5.4+ 已移除此功能,現代專案無需處理。