Câu trả lời:
Như thế này cho ip máy chủ:
$_SERVER['SERVER_ADDR'];
và cái này cho cảng
$_SERVER['SERVER_PORT'];
John K
Thay vào đó, hãy sử dụng câu trả lời
Nếu bạn đang sử dụng phiên bản PHP 5.3 trở lên, bạn có thể làm như sau:
$host= gethostname();
$ip = gethostbyname($host);
Điều này hoạt động tốt khi bạn đang chạy một tập lệnh độc lập, không chạy qua máy chủ web.
/etc/hosts
tệp và sẽ nhanh - mặc dù có thể là vậy 127.0.0.1
. Nếu nó phải gọi DNS thì nó sẽ chậm như bạn nói.
ví dụ:
$_SERVER['SERVER_ADDR']
khi bạn sử dụng IIS, hãy thử:
$_SERVER['LOCAL_ADDR']
$_SERVER['LOCAL_ADDR']
chỉ khả dụng trong IIS khi PHP đang chạy dưới dạng mô-đun CGI.
Tôi đến trang này để tìm cách lấy địa chỉ ip của chính mình không phải của một máy từ xa đang kết nối với tôi.
Điều này sẽ không hoạt động đối với máy tính Windows.
Nhưng trong trường hợp ai đó tìm kiếm những gì tôi đang tìm kiếm:
#! /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;
(Điều chỉnh một cách đáng xấu hổ từ Cách lấy địa chỉ IP chính của máy cục bộ trên Linux và 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\.'
Không câu trả lời nào được bình chọn nhiều nhất sẽ trả về địa chỉ công cộng của máy chủ một cách đáng tin cậy. Nói chung $_SERVER['SERVER_ADDR']
sẽ đúng, nhưng nếu bạn đang truy cập máy chủ thông qua VPN, nó có thể sẽ trả về địa chỉ mạng nội bộ thay vì địa chỉ công cộng và ngay cả khi không ở trên cùng một mạng, một số cấu hình sẽ đơn giản là trống hoặc có một số cấu hình khác được chỉ định giá trị.
Tương tự như vậy, có những trường hợp $host= gethostname(); $ip = gethostbyname($host);
sẽ không trả về giá trị chính xác vì nó dựa vào cả DNS (được định cấu hình nội bộ hoặc bản ghi bên ngoài) và cài đặt tên máy chủ của máy chủ để ngoại suy địa chỉ IP của máy chủ. Cả hai bước này đều có khả năng bị lỗi. Ví dụ: nếu tên máy chủ của máy chủ được định dạng giống như tên miền (tức là HOSTNAME=yahoo.com
) thì (ít nhất là trên thiết lập php5.4 / Centos6 của tôi) gethostbyname
sẽ chuyển thẳng đến việc tìm địa chỉ của Yahoo.com thay vì máy chủ cục bộ.
Hơn nữa, do lỗi gethostbyname
ghi lại DNS công cộng, một máy chủ thử nghiệm có các bản ghi DNS công cộng chưa được xuất bản hoặc không chính xác (ví dụ: bạn đang truy cập máy chủ bằng localhost
hoặc địa chỉ IP hoặc nếu bạn đang ghi đè DNS công cộng bằng hosts
tệp cục bộ của mình ) thì bạn ' Sẽ lấy lại không có địa chỉ IP (nó sẽ chỉ trả về tên máy chủ) hoặc thậm chí tệ hơn là nó sẽ trả về địa chỉ sai được chỉ định trong các bản ghi DNS công cộng nếu tồn tại hoặc nếu có ký tự đại diện cho miền.
Tùy thuộc vào tình huống, bạn cũng có thể thử cách tiếp cận thứ ba bằng cách làm như sau:
$external_ip = exec('curl http://ipecho.net/plain; echo');
Điều này có những sai sót riêng (phụ thuộc vào một trang web cụ thể của bên thứ ba và có thể có các cài đặt mạng định tuyến các kết nối ra ngoài thông qua một máy chủ hoặc proxy khác) và giống như gethostbyname
nó có thể chậm. Thành thật mà nói, tôi không chắc cách tiếp cận nào sẽ chính xác thường xuyên nhất, nhưng bài học cần rút ra là các tình huống / cấu hình cụ thể sẽ dẫn đến kết quả đầu ra không chính xác cho tất cả các cách tiếp cận này ... vì vậy nếu có thể hãy xác minh rằng cách tiếp cận bạn đang sử dụng đang trả về các giá trị bạn mong đợi.
Đây là những gì bạn có thể sử dụng như một sự thích ứng của các ví dụ trên mà không cần lo lắng về việc cài đặt curl trên máy chủ của bạn.
<?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);
?>
Nếu bạn đang sử dụng PHP trong bash shell, bạn có thể sử dụng:
$server_name=exec('hostname');
Bởi vì $_SERVER[] SERVER_ADDR
, HTTP_HOST
và SERVER_NAME
không được thiết lập.
Tôi thấy điều này phù hợp với tôi: GetHostByName ("");
Chạy XAMPP v1.7.1 trên Windows 7 chạy máy chủ web Apache. Thật không may, nó chỉ cung cấp địa chỉ IP cổng của tôi.
Tôi vừa tạo một tập lệnh đơn giản sẽ trả lại $ _SERVER ['REMOTE_ADDR'] và $ _SERVER ['SERVER_ADDR'] trong IIS để bạn không phải thay đổi mọi biến. Chỉ cần dán văn bản này vào tệp php của bạn được bao gồm trong mọi trang.
/** IIS IP Check **/
if(!$_SERVER['SERVER_ADDR']){ $_SERVER['SERVER_ADDR'] = $_SERVER['LOCAL_ADDR']; }
if(!$_SERVER['REMOTE_ADDR']){ $_SERVER['REMOTE_ADDR'] = $_SERVER['LOCAL_ADDR']; }
Kiểm tra mảng $ _SERVER
echo $_SERVER['SERVER_ADDR'];
$_SERVER["SERVER_ADDR"]
không liên quan gì đến tiêu đề HTTP. Điều này được lấp đầy bởi phần mềm máy chủ, tất cả những thứ liên quan đến HTTP trong $ _SERVER đều có tiền tố là HTTP_. php.net/manual/en/reserved.variables.server.php
Như thế này:
$_SERVER['SERVER_ADDR'];