Lấy địa chỉ IP khách truy cập với PHP

Đối với lập trình viên, hầu như ai cũng từng có nhu cầu lấy địa chỉ IP (Internet Protocol) của người dùng để phục vụ cho nhiều mục đích khác nhau như: ghi log lịch sử truy cập, giới hạn đăng nhập, chống spam, chặn truy cập theo IP hoặc thống kê lượt xem.

Lấy địa chỉ IP khách truy cập với PHP

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 proxy
  • REMOTE_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_ADDR có thể là IP của proxy hoặc CDN
  • HTTP_X_FORWARDED_FOR có 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.

Bình luận


2 bình luận
  • 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

Init Toolbox

Nhấn Ctrl + \ trên máy tính, hoặc vuốt sang trái ở bất kỳ đâu trên mobile.

Đăng nhập





Đang tải...