2011-10-26 42 views

Trả lời

26

Chỉ cần truy vấn một máy chủ trả về địa chỉ IP của bạn:

$externalContent = file_get_contents('http://checkip.dyndns.com/'); 
preg_match('/Current IP Address: \[?([:.0-9a-fA-F]+)\]?/', $externalContent, $m); 
$externalIp = $m[1]; 

hay, thiết lập một dịch vụ mà chỉ đơn giản lặp chỉ IP, và sử dụng nó như thế này:

$externalIp = file_get_contents('http://yourdomain.example/ip/'); 

Thiết lập tự phục vụ bằng cách đơn giản là lặp lại địa chỉ IP từ xa, hoặc trả tiền cho ai đó để lưu trữ nó. Làm không sử dụng máy chủ của người khác mà không được phép. Trước đây, câu trả lời này liên quan đến một dịch vụ của tôi hiện đang bị tấn công nhiều lần trong một giây.

Lưu ý rằng trong mạng IP có một hoặc nhiều NATs, bạn có thể có nhiều địa chỉ IP bên ngoài bên ngoài. Điều này sẽ cung cấp cho bạn chỉ một trong số họ.

Ngoài ra, giải pháp này tất nhiên phụ thuộc vào máy chủ từ xa khả dụng. Tuy nhiên, vì không có tiêu chuẩn được triển khai rộng rãi (không có ISP và chỉ một số bộ định tuyến gia đình thực hiện UPnP), không có cách nào khác để nhận địa chỉ IP bên ngoài của bạn. Ngay cả khi bạn có thể nói chuyện với NAT địa phương của bạn, bạn không thể chắc chắn rằng không có NAT khác đằng sau nó.

+10

Oh yeah và những gì nếu trang web đó là ẩn? Đúng vậy, bạn sẽ bị buộc phải chết. –

+0

@WTP Vâng, bạn chắc chắn có thể dự phòng đến một địa chỉ khác. Nhưng nói chung, không có cách nào khác nếu bạn đang đứng sau NAT hoặc một số loại đường hầm khác. – phihag

+0

Nếu có chức năng trong ứng dụng của bạn nơi địa chỉ IP từ xa là quan trọng, nó phải được đặt trong một cấu hình ở đâu đó chứ không phải bởi một dịch vụ bên ngoài. –

4

Bạn có thể thử này:

$ip = gethostbyname('www.example.com'); 
echo $ip; 

để có được địa chỉ IP liên kết với tên miền của bạn.

6

Bạn có thể phân tích nó từ một dịch vụ như ip6.me:

<?php 

// Pull contents from ip6.me 
$file = file_get_contents('http://ip6.me/'); 

// Trim IP based on HTML formatting 
$pos = strpos($file, '+3') + 3; 
$ip = substr($file, $pos, strlen($file)); 

// Trim IP based on HTML formatting 
$pos = strpos($ip, '</'); 
$ip = substr($ip, 0, $pos); 

// Output the IP address of your box 
echo "My IP address is $ip"; 

// Debug only -- all lines following can be removed 
echo "\r\n<br/>\r\n<br/>Full results from ip6.me:\r\n<br/>"; 
echo $file; 
+0

Như mô tả trên trang ip6.me, bạn nên sử dụng trang 'ip4.me' thay vì trình duyệt của bạn (khách hàng của bạn) có thể không có kết nối IPv6 và hiển thị 'Không tìm thấy trang' trong trường hợp này. – trejder

-3

Bạn đã thử:

gethostbyname(php_uname('n')); 

?

+0

'php_uname ('n')' trả về trong hầu hết các trường hợp địa chỉ IP ** nội bộ **, tức là dựa trên mạng LAN. OP yêu cầu một ** bên ngoài **. – trejder

0

Nếu máy chủ của bạn có một tên miền bạn có thể ping nó hoặc bạn có thể sử dụng:

$sMyServerIP = gethostbyname('yourdomain.com'); 
echo $sMyServerIP; 

Nó sẽ trả lại địa chỉ IP bên ngoài của bạn.

0

Giả sử PHP của bạn đang chạy trên máy chủ Linux, bạn có thể gọi ifconfig bằng cách sử dụng hàm exec của PHP. Điều này sẽ cung cấp cho IP công cộng mà không cần phải liên hệ với một số trang web/dịch vụ bên ngoài. Ví dụ:

$command = "ifconfig"; /// see notes below 
$interface = "eth0"; // 
exec($command, $output); 
$output = implode("\n",$output); 
if (preg_match('/'.preg_quote($interface).'(.+?)[\r\n]{2,}/s', $output, $ifaddrsMatch) 
     && preg_match_all('/inet(6)? addr\s*\:\s*([a-z0-9\.\:\/]+)/is', $ifaddrsMatch[1], $ipMatches, PREG_SET_ORDER)) 
{ 
    foreach ($ipMatches as $ipMatch) 
     echo 'public IPv'.($ipMatch[1]==6?'6':'4').': '.$ipMatch[2].'<br>'; 
} 

Lưu ý rằng đôi khi là lệnh $, bạn phải chỉ định đường dẫn đầy đủ của ifconfig. Bạn có thể tìm thấy điều này bằng cách thực hiện

whereis ifconfig

từ dấu nhắc shell. Hơn nữa giao diện $ nên được đặt thành tên giao diện mạng chính của máy chủ của bạn có liên kết đến WAN.

Trên Windows, bạn có thể làm điều gì đó tương tự, sử dụng ipconfig thay vì ifconfig (và regex được điều chỉnh tương ứng).

0

Ngoài ra bạn có thể nhận IP qua DNS Một hồ sơ dựa trên tên máy hoặc máy chủ và tên:

$dnsARecord = dns_get_record($_SERVER['HTTP_HOST'],DNS_A); 
if ($dnsARecord) echo 'IPv4: '.$dnsARecord[0]['ip']; 
$dnsARecord = dns_get_record($_SERVER['HTTP_HOST'],DNS_AAAA); 
if ($dnsARecord) echo 'IPv6: '.$dnsARecord[0]['ip']; 

Bạn cũng có thể sử dụng SERVER_NAME thay vì HTTP_HOST nếu một trong hai không đưa ra những gì bạn muốn.

Tuy nhiên, điều này giả định rằng máy chủ của bạn được định cấu hình chính xác tương ứng với DNS. Điều này có thể không phải lúc nào cũng đúng. Xem câu trả lời khác của tôi bằng cách sử dụng ifconfig có lẽ tốt hơn.

25

Không có cách nào để lấy địa chỉ IP cơ bản của bạn đã được chỉ định bởi ISP của bạn thông qua PHP thông thường nếu bạn đang sử dụng bộ định tuyến. Một cách để có được IP bên ngoài là tìm một dịch vụ sẽ lấy nó cho bạn và lặp lại địa chỉ cho bạn. Tôi tìm thấy một dịch vụ tiện dụng mà chỉ làm điều đó. http://ipecho.net/

Bạn có thể sử dụng:

$realIP = file_get_contents("http://ipecho.net/plain"); 
+1

Sử dụng ipecho.net đẹp hơn nhiều so với phân tích cú pháp phản hồi HTML. Câu trả lời này nên được coi là câu trả lời được chấp nhận mới. –

+2

Hai câu đầu tiên mâu thuẫn với nhau. Không thể có "không có cách nào" và sau đó là "cách duy nhất". Ngoài ra, "CHỈ" là một từ ** rất mạnh ** ở đó. – jeteon

4

tôi sẽ thêm một giải pháp bởi vì những người khác là không hoàn toàn đúng đối với tôi bởi vì họ:

  • cần phải được chạy trên máy chủ với một tên miền ví dụ gethostbyname() (nếu bạn nghĩ về nó, bạn không thực sự có vấn đề nếu bạn biết điều này trước)
  • không thể được sử dụng trên CLI (dựa trên một cái gì đó trong $_SERVER được thiết lập bởi một máy chủ web)
  • giả định định dạng cụ thể là ifconfig đầu ra, có thể bao gồm nhiều giao diện không công khai
  • phụ thuộc vào phân tích cú pháp trang web của ai đó (có thể biến mất, thay đổi URL, thay đổi định dạng, bắt đầu nói dối bạn, v.v., tất cả mà không cần thông báo)

Đây là những gì tôi sẽ đề xuất:

$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); 
$res = socket_connect($sock, '8.8.8.8', 53); 
// You might want error checking code here based on the value of $res 
socket_getsockname($sock, $addr); 
socket_shutdown($sock); 
socket_close($sock); 

echo $addr; // Ta-da! The IP address you're connecting from 

Địa chỉ IP có máy chủ Google public DNS. Tôi tin tưởng họ sẽ được xung quanh và chạy nó trong một thời gian. Nó không thực sự quan trọng bạn sử dụng địa chỉ nào miễn là địa chỉ IP công cộng của nó thuộc về một người không bận tâm đến những nỗ lực kết nối ngẫu nhiên quá nhiều (có thể bạn?).

Điều này được dựa trên answer Tôi gặp phải khi tôi gặp sự cố tương tự trong Python.


P .: Tôi không chắc chắn mức độ này sẽ hiệu quả như thế nào nếu có ma thuật xảy ra giữa máy của bạn và internet.

+0

Tùy chọn tốt nhất! :) – Nek

1

Tôi biết câu hỏi này được trả lời cũ và dài, nhưng tôi đã googling cho cùng một điều và muốn thêm "hack" của riêng tôi. Để làm điều này, yêu cầu web của bạn phải đến từ địa chỉ IP bên ngoài hoặc bạn phải thay đổi $own_url thành url yêu cầu bên ngoài.

Vấn đề là, nếu bạn để tập lệnh tự thực hiện yêu cầu hơn là bạn nhận được địa chỉ IP bên ngoài.

<?php 
if (isset($_GET['ip'])) { 
    die($_SERVER['REMOTE_ADDR']); 
} 
$own_url = (isset($_SERVER['HTTPS']) ? 'https' : 'http') . '://'.$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME']; 
$ExternalIP = file_get_contents($own_url.'?ip=1'); 
echo $ExternalIP; 
?> 
0

Tôi nghĩ rằng có nhiều mã cho điều này ở những người khác câu trả lời, nhưng câu trả lời của tôi là ngắn, nhưng bạn cần phải thực hiện một lệnh trong shell để có được ip ...

nhưng nó là ngắn và nhanh chóng, tôi nghĩ rằng ...

php thực hiện bash> bash chạy> bash get ip> php lấy ip

echo shell_exec("dig +short myip.opendns.com @resolver1.opendns.com"); 

Xin lỗi tôi cho tiếng anh của tôi, tôi hy vọng nó giúp tất cả các bạn ...

tham khảo: How can I get my external IP address in a shell script?

Các vấn đề liên quan