Cara mengidentifikasi alamat IP server di PHP

122

Bagaimana cara mengidentifikasi alamat IP server di PHP?

pooja
sumber
2
maksud Anda alamat IP permintaan atau IP mesin yang menjalankan aplikasi Anda?
wosis

Jawaban:

175

Seperti ini untuk ip server:

$_SERVER['SERVER_ADDR'];

dan ini untuk pelabuhan

$_SERVER['SERVER_PORT'];
CloudyMarble
sumber
9
Tidak. Pada beberapa host bersama, ini mengembalikan :: 1
TheRealChx101
3
Ini mungkin salah tergantung pada Load Balancer yang digunakan di depan server web Anda. Anda juga menginginkan header X-Forwarded-For dalam skenario ini: en.wikipedia.org/wiki/X-Forwarded-For
Ligemer
31
Ini BUKAN alamat server! Ini adalah alamat yang dipanggil oleh browser jarak jauh ke server, yang berada di bawah kendali pengguna jarak jauh. Gunakan jawaban dengan John Ksebaliknya
Ariel
Ini tidak memberikan ip server. Untuk beberapa alasan itu memberikan ip lokal saya
Thomas Williams
Itu juga tidak memberikan alamat server php-fpm, tetapi untuk server web terkait (nginx, apache). Jadi itu tidak akan benar untuk spesifikasi host klien-mysql (pengguna @ host).
scipilot
105

Jika Anda menggunakan PHP versi 5.3 atau lebih tinggi, Anda dapat melakukan hal berikut:

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

Ini berfungsi dengan baik saat Anda menjalankan skrip yang berdiri sendiri, tidak melalui server web.

John K
sumber
Sempurna, Apa yang saya cari. Terima kasih John
Frank
6
+1 Ini adalah satu-satunya solusi yang akan berfungsi dengan baris perintah.
Adam Elsodaney
2
@ Seharusnya tidak. Nama host lokal harus ada dalam /etc/hostsfile dan akan cepat - meskipun mungkin saja 127.0.0.1. Jika memang harus memanggil DNS maka akan lambat seperti yang Anda katakan.
Ariel
+1 tapi hanya sebuah pertanyaan .. saya mencobanya dengan xampp di server lokal dan mengembalikan ip 192.168etc tapi .. harus 127.0.0.1 tidak ??
Andrea Bori
ini berfungsi untuk saya tetapi beberapa mesin menampilkan nama domainnya. bagaimana memperbaiki masalah ini.
Dharani Dharan
19

sebagai contoh:

$_SERVER['SERVER_ADDR']

saat Anda menggunakan IIS, coba:

$_SERVER['LOCAL_ADDR']
Labu
sumber
2
$_SERVER['LOCAL_ADDR']hanya tersedia di bawah IIS ketika PHP dijalankan sebagai modul CGI.
Rudi Visser
@rudi_visser bekerja dengan fastcgi juga, tetapi jika Anda terhubung melalui locahost, Anda mendapatkan :: 1 kembali. Jika Anda terhubung melalui nama server atau ip, Anda mendapatkan kembali ip asli.
starbeamrainbowlabs
@starbeamrainbowlabs FastCGI adalah CGI :) Maksud saya berbeda dengan menjalankan sebagai modul ISAPI, ini ditulis sebelum munculnya FastCGI sebagai platform stabil.
Rudi Visser
@starbeamrainbowlabs apa pun yang terlihat seperti :: 1 mungkin adalah alamat IP6
Toby Allen
@TobyAllen Terima kasih :). Yang aneh adalah bahwa jaringan saya tidak mendukung ipv6, namun server saya (mesin windows 7) melaporkan IP-nya sebagai :: 1, alamat loopback ipv6.
starbeamrainbowlabs
13

Saya datang ke halaman ini mencari cara untuk mendapatkan alamat ip saya sendiri, bukan salah satu mesin jarak jauh yang terhubung ke saya.

Ini tidak akan bekerja untuk mesin windows.

Tetapi jika seseorang menelusuri apa yang saya cari:

#! /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;

(Tanpa malu-malu diadaptasi dari Bagaimana cara mendapatkan alamat IP utama dari mesin lokal di Linux dan OS X? )

Dom
sumber
Ini adalah satu-satunya pilihan yang benar-benar berfungsi saat menjalankan skrip PHP dari shell. Pertanyaan: ketika ada beberapa antarmuka yang aktif, bagaimana cara memutuskan alamat mana yang akan dikembalikan? Saya menguji dengan koneksi ethernet kabel dan nirkabel aktif, dan kemudian dengan hanya nirkabel aktif, dan itu mengembalikan ip wlan kedua kali. Naskah yang bagus, terima kasih!
Ryan Griggs
Ia sebenarnya tidak tahu mana yang harus dikembalikan. Ini hanya mengembalikan antarmuka inet terakhir dari output ifconfig, tetapi mengabaikan 127.0.0.1. Jika Anda hanya memiliki antarmuka "biasa", maka itu berfungsi dengan baik. Mungkin paling aman jika Anda menetapkan antarmuka yang Anda inginkan "ifconfig wlan0 | ...". Skrip ini sama sekali tidak sempurna tetapi berfungsi dalam pengaturan sederhana dan mendemonstrasikan bagaimana melakukan ini pada prinsipnya, untuk disesuaikan sesuai kebutuhan.
Dom
1
ifconfig | grep 'inet addr' | potong -d ':' -f 2 | awk '{print $ 1}' | grep -vE '^ (192 \ .168 | 10 \. | 172 \ .1 [6789] \. | 172 \ .2 [0-9] \. | 172 \ .3 [01] \. | 127 \. ) 'adalah revisi terakhir saya untuk ini. Ini menyaring semua ip lokal dan hanya memberi Anda eksternal
Dom
Saya memiliki beberapa antarmuka jaringan jadi saya melakukannyaifconfig | 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\.'
Jonathan
10

Tak satu pun dari jawaban yang paling banyak dipilih akan mengembalikan alamat publik server dengan andal. Umumnya $_SERVER['SERVER_ADDR']akan benar, tetapi jika Anda mengakses server melalui VPN, kemungkinan akan mengembalikan alamat jaringan internal daripada alamat publik, dan bahkan ketika tidak berada di jaringan yang sama beberapa konfigurasi hanya akan kosong atau ada yang lain ditentukan nilai.

Demikian juga, ada skenario di mana $host= gethostname(); $ip = gethostbyname($host);tidak akan mengembalikan nilai yang benar karena mengandalkan DNS (baik yang dikonfigurasi secara internal atau catatan eksternal) dan pengaturan nama host server untuk memperkirakan alamat IP server. Kedua langkah ini berpotensi salah. Misalnya, jika nama host server diformat seperti nama domain (yaitu HOSTNAME=yahoo.com) maka (setidaknya pada pengaturan php5.4 / Centos6 saya) gethostbynameakan langsung langsung menemukan alamat Yahoo.com daripada server lokal.

Selanjutnya, karena gethostbynamekembali ke catatan DNS publik server pengujian dengan catatan DNS publik yang tidak diterbitkan atau salah (misalnya, Anda mengakses server dengan localhostatau alamat IP, atau jika Anda menimpa DNS publik menggunakan hostsfile lokal Anda ) maka Anda ' tidak akan mendapatkan kembali alamat IP (itu hanya akan mengembalikan nama host) atau lebih buruk lagi itu akan mengembalikan alamat yang salah yang ditentukan dalam catatan DNS publik jika ada atau jika ada karakter pengganti untuk domain tersebut.

Bergantung pada situasinya, Anda juga dapat mencoba pendekatan ketiga dengan melakukan sesuatu seperti ini:

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

Ini memiliki kekurangannya sendiri (bergantung pada situs pihak ketiga tertentu, dan mungkin ada pengaturan jaringan yang merutekan koneksi keluar melalui host atau proxy yang berbeda) dan seperti gethostbynameitu bisa lambat. Sejujurnya saya tidak yakin pendekatan mana yang paling sering benar, tetapi pelajaran yang perlu diperhatikan adalah bahwa skenario / konfigurasi tertentu akan menghasilkan keluaran yang salah untuk semua pendekatan ini ... jadi jika memungkinkan verifikasi bahwa pendekatan Anda menggunakan mengembalikan nilai yang Anda harapkan.

Ben D
sumber
9

Inilah yang dapat Anda gunakan sebagai adaptasi dari contoh di atas tanpa khawatir curl terinstal di server Anda.

<?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);
    ?>
Emmanuel Mahuni
sumber
5

Jika Anda menggunakan PHP di bash shell, Anda dapat menggunakan:

$server_name=exec('hostname');

Karena $_SERVER[] SERVER_ADDR, HTTP_HOSTdan SERVER_NAMEtidak diatur.

Stefano Zanola
sumber
4

Jawaban sebelumnya semuanya memberikan $ _SERVER ['SERVER_ADDR']. Ini tidak akan bekerja pada beberapa instalasi IIS. Jika Anda ingin ini bekerja di IIS, gunakan yang berikut ini:

$server_ip = gethostbyname($_SERVER['SERVER_NAME']);
qbert220.dll
sumber
2

Saya menemukan ini bekerja untuk saya: GetHostByName ("");

Menjalankan XAMPP v1.7.1 di Windows 7 menjalankan server web Apache. Sayangnya itu hanya memberikan alamat IP gateway saya.

Sanford Staab
sumber
2

Saya baru saja membuat skrip sederhana yang akan mengembalikan $ _SERVER ['REMOTE_ADDR'] dan $ _SERVER ['SERVER_ADDR'] di IIS sehingga Anda tidak perlu mengubah setiap variabel. Cukup tempel teks ini di file php Anda yang disertakan di setiap halaman.

/** IIS IP Check **/
if(!$_SERVER['SERVER_ADDR']){ $_SERVER['SERVER_ADDR'] = $_SERVER['LOCAL_ADDR']; }
if(!$_SERVER['REMOTE_ADDR']){ $_SERVER['REMOTE_ADDR'] = $_SERVER['LOCAL_ADDR']; }
Xander
sumber
1
$serverIP = $_SERVER["SERVER_ADDR"];
echo "Server IP is: <b>{$serverIP}</b>";
Kapak
sumber
1

Anda mungkin harus menggunakan $HTTP_SERVER_VARS['server_ADDR']jika Anda tidak mendapatkan apa pun dari jawaban di atas dan jika Anda menggunakan versi PHP yang lebih lama

OpenCode
sumber
0

Periksa array $ _SERVER

echo $_SERVER['SERVER_ADDR'];
Gaurang
sumber
1
Itu tidak menemukan "IP asli", ia menemukan header HTTP yang sewenang-wenang dan tidak diverifikasi yang dapat diatur siapa pun dan siapa pun dapat menggunakan untuk memalsukan IP mereka jika Anda menginginkannya. Jika klien berada di belakang proxy maka jangan percaya header HTTP apa pun. Ini juga tidak sesuai dengan pertanyaannya sama sekali.
menipu
2
Tidak dapat memahami bagaimana jawaban ini tidak sesuai dengan pertanyaan sama sekali. Pertanyaannya adalah: "Bagaimana cara mengidentifikasi alamat IP server di PHP?". Baik OP belajar bagaimana bertanya lebih baik, atau haruskah Anda belajar membaca pertanyaan. Selain itu, jika klien berada di belakang proxy, Anda masih kacau apa pun yang Anda coba dari sisi server. Skenario yang sama sekali berbeda adalah ketika server berada di belakang proxy, karena Anda dapat memeriksa dengan header X-FORWARDED-FOR.
Luis Masuelli
@deceze $_SERVER["SERVER_ADDR"]tidak ada hubungannya dengan header HTTP. Ini diisi oleh perangkat lunak server, semua hal terkait HTTP di $ _SERVER diawali dengan HTTP_. php.net/manual/en/reserved.variables.server.php
poncha
@poncha Komentar saya berkaitan dengan revisi asli kiriman ini.
menipu
-1

Seperti ini:

$_SERVER['SERVER_ADDR'];
Shadow Wizard adalah Ear For You
sumber