Bài viết này (có cập nhật nội dung vào 17/12/2025) hướng dẫn cách lấy IP người dùng trong PHP, từ phương pháp cơ bản đến phương pháp phù hợp với môi trường hiện đại sử dụng CDN, Cloudflare hoặc proxy.
Lấy IP người dùng bằng PHP
PHP cung cấp biến toàn cục $_SERVER chứa thông tin request từ trình duyệt. Trong đó, hai giá trị thường được sử dụng để lấy IP là:
HTTP_X_FORWARDED_FOR: dùng khi request đi qua proxyREMOTE_ADDR: IP mà web server trực tiếp nhận được
Để dễ sử dụng, nên đóng gói logic này vào một hàm.
<?php
function get_user_ip() {
if (array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER) && !empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
if (strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',') > 0) {
$addr = explode(",", $_SERVER['HTTP_X_FORWARDED_FOR']);
return trim($addr[0]);
} else {
return $_SERVER['HTTP_X_FORWARDED_FOR'];
}
} else {
return $_SERVER['REMOTE_ADDR'];
}
}
?>
Gọi hàm để lấy IP khách truy cập:
<?php echo get_user_ip(); ?>
Hiểu giới hạn của cách làm cơ bản
Cách trên hoạt động tốt khi:
- Website không sử dụng CDN
- Không có reverse proxy hoặc load balancer
Trong môi trường hiện đại, request thường đi qua nhiều lớp trung gian. Khi đó:
REMOTE_ADDRcó thể là IP của proxy hoặc CDNHTTP_X_FORWARDED_FORcó thể chứa nhiều IP
Vì vậy, cần một phương thức nâng cao hơn để lấy IP chính xác.
Lấy IP trong môi trường Cloudflare, CDN, Proxy
Một số hệ thống hiện đại sử dụng các header sau để truyền IP thật của người dùng:
CF-Connecting-IP(Cloudflare)X-Forwarded-For(proxy, load balancer)X-Real-IP(Nginx)
Phương pháp được khuyến nghị là:
- Kiểm tra nhiều header theo thứ tự ưu tiên
- Lấy IP đầu tiên nếu có nhiều IP
- Xác thực IP hợp lệ trước khi sử dụng
<?php
function get_user_ip_modern() {
$ip_keys = [
'HTTP_CF_CONNECTING_IP', // Cloudflare
'HTTP_X_FORWARDED_FOR', // Proxy / Load balancer
'HTTP_X_REAL_IP', // Nginx
'HTTP_CLIENT_IP', // Proxy
'REMOTE_ADDR' // Fallback
];
foreach ($ip_keys as $key) {
if (!empty($_SERVER[$key])) {
$ip = trim($_SERVER[$key]);
// X-Forwarded-For có thể chứa nhiều IP
if (strpos($ip, ',') !== false) {
$ip = trim(explode(',', $ip)[0]);
}
if (filter_var($ip, FILTER_VALIDATE_IP)) {
return $ip;
}
}
}
return '127.0.0.1';
}
?>
Sử dụng:
<?php echo get_user_ip_modern(); ?>
Lưu ý khi sử dụng IP người dùng
- Không nên tin các header IP nếu server không nằm sau proxy/CDN đáng tin cậy
- IP không nên là yếu tố bảo mật duy nhất
- Nên kết hợp thêm cookie, session, user-agent hoặc rate limit
Kết luận
Việc lấy IP trong PHP tưởng chừng đơn giản nhưng phụ thuộc nhiều vào hạ tầng triển khai. Với hệ thống cơ bản, phương pháp truyền thống là đủ. Với hệ thống hiện đại sử dụng CDN hoặc proxy, cần áp dụng cách kiểm tra nhiều header để đảm bảo IP chính xác.
viet
27/01/2021 lúc 14:17
co video huong dan khong
Admin
02/02/2021 lúc 19:28
mình ko có làm video bạn ơi