เป็นข้อผิดพลาดที่ไม่นึกว่าจะปล่อยให้หลุดออกมาได้สำหรับการตรวจหา IP Address ของ codeigniter ที่มีโค้ดตรวจหา HTTP_X_FORWARDED_FOR แต่ดันไม่สามารถตรวจหาได้.
ความผิดพลาดนี้เกิดจากการลำดับ if แบบผิดๆ ดังนั้นเราจะมาแก้ไขให้มันเสียใหม่ รับรอง work!
สร้างไฟล์ MY_Input.php ไว้ใน application/core
หากยังไม่มีไฟล์ดังกล่าวให้ใช้โค้ดต่อไปนี้
class MY_Input extends CI_Input
{
public function __construct()
{
parent::__construct();
}// __construct
public function ip_address()
{
if ( $this->ip_address !== false ) {
return $this->ip_address;
}
// IMPROVED!! CI ip address cannot detect through http_x_forwarded_for. this one can do.
if (isset($_SERVER['HTTP_CLIENT_IP'])) {
// //check ip from share internet
$this->ip_address = $_SERVER['HTTP_CLIENT_IP'];
} elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
//to check ip is pass from proxy
$this->ip_address = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$this->ip_address = $_SERVER['REMOTE_ADDR'];
}
//
if ( $this->ip_address === false ) {
$this->ip_address = "0.0.0.0";
return $this->ip_address;
}
//
if ( ! $this->valid_ip($this->ip_address)){
$this->ip_address = '0.0.0.0';
}
//
return $this->ip_address;
}
}
หากคุณมีไฟล์นี้อยู่แล้ว ให้ก๊อปปี้ไปแค่ส่วน function ip_address() { ไปจนถึง } ก็พอ
จาก นั้นลองอัปโหลดขึ้น server ใส่ proxy ให้เบราเซอร์ แล้วลองเรียกดู ( echo $this->input->ip_address();
) จะพบว่ามันทำงานได้ปกติ*
*หมายเหตุ
1. ที่ต้องให้ upload ขึ้น server เพราะหากเรียกแบบ localhost จะได้ค่า 127.0.0.1 เสมอ
2. proxy บางตัวไม่สามารถหาค่า X_FORWARDED_FOR ได้