ฉันจะระบุที่อยู่ 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'];