Hướng dẫn dùng host address trong PHP

Nhiều khi chúng ta cần lấy địa chỉ IP của người truy cập cho các mục đích khác nhau như bảo mật, huyển hướng khách truy cập đến trang khác, chặn / cấm khách truy cập....

Vậy để thu thập được địa chỉ IP của người dùng một cách dễ dàng trong PHP bằng biến $_SERVER

Cách đơn giản nhất để lấy địa chỉ IP của khách truy cập hiện tại trong PHP là sử dụng REMOTE_ADDR trong biến $_SERVER có sẵn trong PHP. 

Lấy địa chỉ IP của client

$_SERVER ['REMOTE_ADDR'] - Nó trả về địa chỉ IP của người dùng hiện đang truy cập trang web.

Ví dụ: 

  

Kết quả :

User IP Address - ::1

Nhưng đôi khi REMOTE_ADDR không trả về địa chỉ IP của máy khách và lý do chính đằng sau là sử dụng proxy. Trong tình huống như vậy, chúng tôi sẽ thử một cách khác để lấy địa chỉ IP thực của người dùng trong PHP.

  

Sơ đồ lấy chương trình lấy địa chỉ IP

Sơ đồ cho chương trình trên sẽ giống như dưới đây.

Lấy địa chỉ IP của website

Một cách khác để lấy địa chỉ IP của bất kỳ trang web nào bằng URL của nó bằng gethostbyname().

Ví dụ:

";  
$ip_address = gethostbyname("www.javatpoint.com");  
echo "IP Address of javaTpoint is - ".$ip_address;  
?>  

Kết quả: 

IP Address of Google is - 172.217.166.4
IP Address of javaTpoint is - 95.216.57.234

$ _SERVER là một biến toàn cục của PHP chứa thông tin về tiêu đề, đường dẫn và vị trí tập lệnh.


echo $_SERVER['PHP_SELF'];
echo "
"
;
echo $_SERVER['SERVER_NAME'];
echo "
"
;
echo $_SERVER['HTTP_HOST'];
echo "
"
;
echo $_SERVER['HTTP_REFERER'];
echo "
"
;
echo $_SERVER['HTTP_USER_AGENT'];
echo "
"
;
echo $_SERVER['SCRIPT_NAME'];
?>

$_SERVER['SERVER_ADDR']  Returns IP address của host

$_SERVER['SERVER_NAME']  Returns Hostname Server

Chúc các bạn thành công.

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

";
}
?>

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.

https://canvas.uccs.edu/eportfolios/10298/Home/How_do_Stock_Market_effects_Economy_

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

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

Hướng dẫn dùng host address trong PHP

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!