[PHP] Lấy địa chỉ IP của khách viếng thăm

Việc lấy địa chỉ IP của khách viếng thăm trang web được sử dụng với nhiều mục đích khác nhau. Ví dụ lấy thông tin tọa độ, đất nước…người dùng rồi từ đó sẽ có những điều hướng trang web thích hợp hơn. Bạn có 1 trang web đa ngôn ngữ và khi biết khách viếng thăm đến từ đâu thì bạn sẽ dề dàng hiển thị thông tin phù hợp với vị khách đó.

Tất cả thông tin liên quan đến địa chỉ IP được chứa trong mảng $_SERVER. Nếu bạn muốn kiểm tra mảng $_SERVER có chứa những thông tin gì thì có thể dùng đoạn code sau

<?php
while (list ($key, $val) = each ($_SERVER)) {
echo $key . " = " . $val . "<br />";
}
?>

Các bạn có thể tham khảo một số thông tin nhận được như sau

HTTP_HOST = localhost
HTTP_CONNECTION = keep-alive
HTTP_CACHE_CONTROL = max-age=0
HTTP_ACCEPT = text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
HTTP_USER_AGENT = Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36
HTTP_ACCEPT_ENCODING = gzip,deflate,sdch
HTTP_ACCEPT_LANGUAGE = vi-VN,vi;q=0.8,fr-FR;q=0.6,fr;q=0.4,en-US;q=0.2,en;q=0.2

Và cách dễ dàng nhất để lấy địa chỉ IP của khách viếng thăm là dùng trường (field) REMOTE_ADDR

$ip = $_SERVER['REMOTE_ADDR'];

Câu lệnh trên sẽ giúp chúng ta lấy được địa chỉ IP một cách trực tiếp nhưng nếu người dùng truy cập đến trang web của bạn thông qua Proxy thì kết quả sẽ không chính xác nữa. Khi đó câu lệnh trên sẽ trả về địa chỉ IP của Proxy thay vì địa chỉ thật sự của người dùng.

Cách giải quyết là chúng ta sẽ sử dụng đến trường X-Forwarded-For hoặc Client-Ip có trong HTTP Header mà có chứa địa chỉ IP của người dùng.

Và đoạn code hoàn chỉnh mà tôi muốn giới thiệu đến các bạn

<?php
/**
* @author: Tấn Việt
* @website: https://tanvietblog.com
* @description: This script will get IP address of visitors
* @copyright 2013
*/
$ip = $_SERVER['REMOTE_ADDR'];
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} else if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
echo "IP address: " . $ip;
?>

Lưu ý:

1) Trong quá trình tìm hiểu những thông tin liên quan đến bài viết này, tối có để ý một comment trên trang Stackoverflow như sau

Lấy địa chỉ IP khách viếng thăm

Như các bạn đã thấy, có một số người đã cảnh báo về 2 biến X-Forwarded-ForClient-Ip vì người dùng có thể thay đổi những giá trị này. Vì không học chuyên sâu về chuyên ngành Mạng nên tôi cũng không rõ về những điều này lắm. Dù sao thì các bạn cũng nên cẩn thận khi thao tác với những trường (field) này. Nhưng các bạn cũng không nên quá lo lắng vì để thay đổi những giá trị này thì đòi hỏi phải có kiến thức chuyên môn nhất định mà khách viếng thăm trang web các bạn không phải ai cũng có kiến thức như thế.

2) Có thể đoạn code này chạy không tốt khi bạn muốn tìm địa chỉ IP trong mạng LAN.

 

Thân ái!

Tấn Việt

Tôi lập trang web này để thỏa mãn sở thích viết cái gì đó vui vui khi rãnh rỗi và đồng thời cũng chia sẻ những gì tôi biết hoặc đọc đâu đó trên mạng về Lập trình web. Tôi hi vọng những bài viết này sẽ giúp ích cho các bạn. Thân ái!

You may also like…

1 Response

  1. Duy Khuong says:

    Mình muốn lấy được tên thiết bị của máy khách với PHP. Không biết có cách nào không ad?