ฉันจะระบุที่อยู่ IP ของเซิร์ฟเวอร์ใน PHP ได้อย่างไร
ฉันจะระบุที่อยู่ IP ของเซิร์ฟเวอร์ใน PHP ได้อย่างไร
คำตอบ:
เช่นนี้สำหรับเซิร์ฟเวอร์ ip:
$_SERVER['SERVER_ADDR'];
และสิ่งนี้สำหรับพอร์ต
$_SERVER['SERVER_PORT'];
John K
ตอบแทน
หากคุณใช้ PHP เวอร์ชัน 5.3 ขึ้นไปคุณสามารถทำสิ่งต่อไปนี้:
$host= gethostname();
$ip = gethostbyname($host);
สิ่งนี้ใช้ได้ดีเมื่อคุณเรียกใช้สคริปต์แบบสแตนด์อะโลนไม่ได้ทำงานผ่านเว็บเซิร์ฟเวอร์
/etc/hosts
ไฟล์และจะได้อย่างรวดเร็ว - 127.0.0.1
แม้ว่ามันก็อาจจะ ถ้ามันต้องเรียก DNS ก็จะช้าเหมือนที่คุณพูด
ตัวอย่างเช่น:
$_SERVER['SERVER_ADDR']
เมื่อคุณใช้ IIS ให้ลอง:
$_SERVER['LOCAL_ADDR']
$_SERVER['LOCAL_ADDR']
ใช้ได้เฉพาะภายใต้ IIS เมื่อ PHP ทำงานเป็นโมดูล CGI
ฉันมาที่หน้านี้เพื่อค้นหาวิธีรับที่อยู่ IP ของตัวเองไม่ใช่ของเครื่องระยะไกลที่เชื่อมต่อกับฉัน
สิ่งนี้จะใช้ไม่ได้กับเครื่อง windows
แต่ในกรณีที่มีคนค้นหาสิ่งที่ฉันกำลังมองหา:
#! /usr/bin/php
<?php
$my_current_ip=exec("ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'");
echo $my_current_ip;
(ดัดแปลงอย่างไร้ยางอายจากฉันจะรับที่อยู่ IP หลักของเครื่องโลคัลบน Linux และ OS X ได้อย่างไร )
ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1' | grep -e '192\.168\.1\.'
คำตอบที่ได้รับการโหวตมากที่สุดจะไม่ส่งคืนที่อยู่สาธารณะของเซิร์ฟเวอร์อย่างน่าเชื่อถือ โดยทั่วไป$_SERVER['SERVER_ADDR']
จะถูกต้อง แต่หากคุณกำลังเข้าถึงเซิร์ฟเวอร์ผ่าน VPN ก็มีแนวโน้มที่จะส่งคืนที่อยู่เครือข่ายภายในแทนที่จะเป็นที่อยู่สาธารณะและแม้ว่าจะไม่ได้อยู่ในเครือข่ายเดียวกันก็ตามการกำหนดค่าบางอย่างก็จะว่างเปล่าหรือมีการระบุอื่น ๆ ความคุ้มค่า
ในทำนองเดียวกันมีบางสถานการณ์ที่$host= gethostname(); $ip = gethostbyname($host);
จะไม่ส่งคืนค่าที่ถูกต้องเนื่องจากอาศัยทั้ง DNS (ทั้งที่กำหนดค่าภายในหรือบันทึกภายนอก) และการตั้งค่าชื่อโฮสต์ของเซิร์ฟเวอร์เพื่อคาดการณ์ที่อยู่ IP ของเซิร์ฟเวอร์ ขั้นตอนทั้งสองนี้อาจผิดพลาดได้ ตัวอย่างเช่นหากชื่อโฮสต์ของเซิร์ฟเวอร์มีรูปแบบเหมือนชื่อโดเมน (เช่นHOSTNAME=yahoo.com
) จากนั้น (อย่างน้อยในการตั้งค่า php5.4 / Centos6 ของฉัน) gethostbyname
จะข้ามไปที่การค้นหาที่อยู่ของ Yahoo.com โดยตรงแทนที่จะเป็นของเซิร์ฟเวอร์ภายใน
นอกจากนี้เนื่องจากการgethostbyname
กลับไปใช้ DNS สาธารณะจะบันทึกเซิร์ฟเวอร์ทดสอบที่มีระเบียน DNS สาธารณะที่ไม่ได้เผยแพร่หรือไม่ถูกต้อง (ตัวอย่างเช่นคุณกำลังเข้าถึงเซิร์ฟเวอร์โดยlocalhost
หรือที่อยู่ IP หรือหากคุณกำลังแทนที่ DNS สาธารณะโดยใช้hosts
ไฟล์ในเครื่องของคุณ) คุณก็จะ ' จะได้รับคืนทั้งที่ไม่มีที่อยู่ IP (มันจะส่งคืนชื่อโฮสต์) หรือที่แย่กว่านั้นคือจะส่งคืนที่อยู่ที่ไม่ถูกต้องที่ระบุในระเบียน DNS สาธารณะหากมีอยู่หรือมีสัญลักษณ์แทนสำหรับโดเมน
คุณสามารถลองแนวทางที่สามโดยทำสิ่งนี้ขึ้นอยู่กับสถานการณ์:
$external_ip = exec('curl http://ipecho.net/plain; echo');
สิ่งนี้มีข้อบกพร่องของตัวเอง (ขึ้นอยู่กับไซต์ของบุคคลที่สามที่เฉพาะเจาะจงและอาจมีการตั้งค่าเครือข่ายที่กำหนดเส้นทางการเชื่อมต่อขาออกผ่านโฮสต์หรือพร็อกซีอื่น) และgethostbyname
อาจทำงานได้ช้า ฉันไม่แน่ใจว่าแนวทางใดจะถูกต้องบ่อยที่สุด แต่บทเรียนที่ต้องคำนึงถึงก็คือสถานการณ์ / การกำหนดค่าที่เฉพาะเจาะจงจะส่งผลให้ผลลัพธ์ที่ไม่ถูกต้องสำหรับแนวทางเหล่านี้ทั้งหมด ... ดังนั้นหากเป็นไปได้ให้ตรวจสอบว่าแนวทางที่คุณเป็น การใช้กำลังส่งคืนค่าที่คุณคาดหวัง
นี่คือสิ่งที่คุณสามารถใช้เป็นการปรับตัวอย่างข้างต้นได้โดยไม่ต้องกังวลเกี่ยวกับ curl ที่ติดตั้งบนเซิร์ฟเวอร์ของคุณ
<?php
// create a new cURL resource
$ch = curl_init ();
// set URL and other appropriate options
curl_setopt ($ch, CURLOPT_URL, "http://ipecho.net/plain");
curl_setopt ($ch, CURLOPT_HEADER, 0);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
// grab URL and pass it to the browser
$ip = curl_exec ($ch);
echo "The public ip for this server is: $ip";
// close cURL resource, and free up system resources
curl_close ($ch);
?>
ตรวจสอบอาร์เรย์$ _SERVER
echo $_SERVER['SERVER_ADDR'];
หากคุณใช้ PHP ใน bash shell คุณสามารถใช้:
$server_name=exec('hostname');
เพราะ$_SERVER[] SERVER_ADDR
, HTTP_HOST
และSERVER_NAME
ไม่ได้ตั้งค่า
คำตอบก่อนหน้านี้ให้ $ _SERVER ['SERVER_ADDR'] สิ่งนี้จะใช้ไม่ได้กับการติดตั้ง IIS บางอย่าง หากคุณต้องการให้สิ่งนี้ทำงานบน IIS ให้ใช้สิ่งต่อไปนี้:
$server_ip = gethostbyname($_SERVER['SERVER_NAME']);
ฉันพบว่าสิ่งนี้ใช้ได้กับฉัน: GetHostByName ("");
เรียกใช้ XAMPP v1.7.1 บน Windows 7 ที่ใช้เว็บเซิร์ฟเวอร์ Apache น่าเสียดายที่ให้ที่อยู่ IP เกตเวย์ของฉัน
ฉันเพิ่งสร้างสคริปต์ง่ายๆที่จะนำ $ _SERVER ['REMOTE_ADDR'] และ $ _SERVER ['SERVER_ADDR'] กลับมาใน IIS ดังนั้นคุณจึงไม่ต้องเปลี่ยนทุกตัวแปร เพียงวางข้อความนี้ในไฟล์ php ของคุณที่มีอยู่ในทุกหน้า
/** IIS IP Check **/
if(!$_SERVER['SERVER_ADDR']){ $_SERVER['SERVER_ADDR'] = $_SERVER['LOCAL_ADDR']; }
if(!$_SERVER['REMOTE_ADDR']){ $_SERVER['REMOTE_ADDR'] = $_SERVER['LOCAL_ADDR']; }
$serverIP = $_SERVER["SERVER_ADDR"];
echo "Server IP is: <b>{$serverIP}</b>";
คุณอาจต้องใช้$HTTP_SERVER_VARS['server_ADDR']
หากคุณไม่ได้รับอะไรเลยจากคำตอบด้านบนและหากคุณใช้ PHP เวอร์ชันเก่ากว่า
ตรวจสอบอาร์เรย์ $ _SERVER
echo $_SERVER['SERVER_ADDR'];
$_SERVER["SERVER_ADDR"]
ไม่มีส่วนเกี่ยวข้องกับส่วนหัว HTTP สิ่งนี้เต็มไปด้วยซอฟต์แวร์เซิร์ฟเวอร์สิ่งที่เกี่ยวข้องกับ HTTP ทั้งหมดใน $ _SERVER ขึ้นต้นด้วย HTTP_ php.net/manual/en/reserved.variables.server.php
แบบนี้:
$_SERVER['SERVER_ADDR'];