簡體   English   中英

如何在 PHP 中識別服務器 IP 地址

[英]How to identify server IP address in PHP

如何在 PHP 中識別服務器 IP 地址?

對於服務器 ip,就像這樣:

$_SERVER['SERVER_ADDR'];

這對於港口

$_SERVER['SERVER_PORT'];

如果您使用 PHP 5.3 或更高版本,您可以執行以下操作:

$host= gethostname();
$ip = gethostbyname($host);

當您運行獨立腳本而不是通過 web 服務器運行時,這很有效。

例如:

$_SERVER['SERVER_ADDR']

當您使用 IIS 時,請嘗試:

$_SERVER['LOCAL_ADDR']

我來到這個頁面是為了尋找一種方法來獲取我自己的 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;

(無恥改編自How to I get the primary IP address of local machine on Linux and OS X?

投票最多的答案都不會可靠地返回服務器的公共地址。 通常$_SERVER['SERVER_ADDR']是正確的,但是如果您通過 VPN 訪問服務器,它可能會返回內部網絡地址而不是公共地址,即使不在同一個網絡上,某些配置也會簡單為空白或具有其他指定值。

同樣,在某些情況下$host= gethostname(); $ip = gethostbyname($host); $host= gethostname(); $ip = gethostbyname($host); 不會返回正確的值,因為它依賴於 DNS(內部配置或外部記錄)和服務器的主機名設置來推斷服務器的 IP 地址。 這兩個步驟都有潛在的錯誤。 例如,如果服務器的主機名的格式類似於域名(即HOSTNAME=yahoo.com ),那么(至少在我的 php5.4/Centos6 設置中) gethostbyname將直接跳到查找 Yahoo.com 的地址而不是本地地址服務器的。

Furthermore, because gethostbyname falls back on public DNS records a testing server with unpublished or incorrect public DNS records (for instance, you're accessing the server by localhost or IP address, or if you're overriding public DNS using your local hosts file)那么您將返回沒有 IP 地址(它只會返回主機名),或者更糟糕的是,它會返回公共 DNS 記錄中指定的錯誤地址(如果存在),或者如果域存在通配符。

根據情況,您還可以通過執行以下操作嘗試第三種方法:

$external_ip = exec('curl http://ipecho.net/plain; echo');

這有其自身的缺陷(依賴於特定的第三方站點,並且可能存在通過不同主機或代理路由出站連接的網絡設置),並且像gethostbyname它可能會很慢。 老實說,我不確定哪種方法最經常是正確的,但要牢記的教訓是,特定的場景/配置將導致所有這些方法的輸出不正確......所以如果可能的話,請驗證你使用的方法using 正在返回您期望的值。

這就是您可以用作上述示例的改編版,而不必擔心服務器上安裝的 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'];

如果您在 bash shell 中使用 PHP,您可以使用:

$server_name=exec('hostname');

因為$_SERVER[] SERVER_ADDRHTTP_HOSTSERVER_NAME沒有設置。

前面的答案都給出了 $_SERVER['SERVER_ADDR']。 這不適用於某些 IIS 安裝。 如果您希望它適用於 IIS,請使用以下命令:

$server_ip = gethostbyname($_SERVER['SERVER_NAME']);

我發現這對我有用:GetHostByName("");

在運行 Apache 網絡服務器的 Windows 7 上運行 XAMPP v1.7.1。 不幸的是,它只是給了我的網關 IP 地址。

我剛剛創建了一個簡單的腳本,它將帶回 IIS 中的 $_SERVER['REMOTE_ADDR'] 和 $_SERVER['SERVER_ADDR'] ,因此您不必更改每個變量。 只需將此文本粘貼到包含在每個頁面中的 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>";

如果您沒有從上述答案中得到任何信息並且您使用的是舊版本的 PHP,您可能必須使用$HTTP_SERVER_VARS['server_ADDR']

您可以使用https://icanhazip.com並且由於Cloudflare 擁有該項目,因此有時它會更加可靠。

$my_real_ip = file_get_contents('https://icanhazip.com/');

檢查 $_SERVER 數組

echo $_SERVER['SERVER_ADDR'];

當站點在負載均衡器、反向代理服務器或 CloudFront 等 CDN 之后運行時,這是一種解決方案:

$conn = curl_init();
curl_setopt($conn, CURLOPT_URL, 'any.valid.url');
curl_exec($conn);
$WebServerIP = curl_getinfo($conn)['local_ip'];

要准確獲取外部IP地址,可以調用亞馬遜提供的服務checkip.amazonaws.com。

$ip = exec("curl https://checkip.amazonaws.com");

正如我們所見,這是一個如此普遍的問題,以至於 AWS 創造了這個工具供全世界使用。

我會在其他類似的服務上使用它,因為它是由 AWS 提供的,並且可能會存在很長時間。

像這樣:

$_SERVER['SERVER_ADDR'];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM