Comment puis-je obtenir l'adresse IP externe de mon serveur à l'aide de PHP?
J'entends souvent les gens dire à utiliser "$_SERVER['SERVER_ADDR']", mais qui renvoie l'adresse IP LAN de mon serveur (192.168.1.100). Je veux l'adresse IP externe.
Mettre en place le service vous-même simplement en faisant écho à l'adresse IP distante, ou de payer quelqu'un pour l'héberger. Ne pas utiliser de quelqu'un d'autre serveur sans l'autorisation. Auparavant, cette réponse liée à un service de mine qui est maintenant frapper plusieurs fois par seconde.
Noter que dans un réseau IP avec un ou plusieurs NATs, vous pouvez avoir plusieurs adresses IP externes. Cela vous donnera juste l'un d'eux.
Aussi, cette solution dépend bien sûr de l'hôte distant. Cependant, puisqu'il n'est pas largement mis en œuvre standard (pas de fournisseur de services internet et seulement certains routeurs mettre en œuvre UPnP), il n'y a pas d'autre moyen pour obtenir votre adresse IP externe. Même si vous pourriez nous parler de votre local NAT, vous ne pouvez pas être sûr qu'il n'y a pas d'autre NAT derrière elle.
Ah oui et si ce site est hors-ligne? C'est vrai, vous allez être vissé à la mort. Eh bien, vous pourriez certainement secours à une autre adresse. Mais en général, il n'y a pas d'autre moyen si vous êtes derrière un NAT ou un autre type de tunnel. Si il y a des fonctionnalités au sein de votre application où l'adresse IP distante est essentiel, il doit être réglé dans une configuration quelque part plutôt que par un service externe. C'est " la triste vérité. Oubliez les superglobales, les variables d'environnement de l'hôte ou IP qui lui est associée est "réel", le contact est la seule façon d'obtenir l'adresse IP actuelle. Le [ est de permettre à des crochets, qui sont souvent utilisés pour délimiter les adresses IPv6. La finale < est en effet en option, et rend le code plus robuste si le format doit changer.
Il n'existe AUCUN moyen pour obtenir votre Adresse IP sous-jacente qui a été désigné par votre fournisseur de services internet via classiques PHP si vous utilisez un routeur. Un moyen d'obtenir l'adresse IP externe est de trouver un service qui permettra de l'obtenir pour vous d'écho et de l'adresse de retour pour vous. J'ai trouvé un service pratique qui ne fait que cela. http://ipecho.net/
À l'aide de ipecho.net est beaucoup plus agréable que l'analyse d'une réponse HTML. Cette réponse doit être considéré comme la nouvelle accepté de répondre. Les deux premières phrases se contredisent l'une l'autre. Il ne peut pas être "no way", puis un "seul moyen". Aussi, "SEULEMENT" est un très mot fort.
Vous pu analyser à partir d'un service comme ip6.moi:
<?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;
Comme dans la description de l'ip6.moi la page, vous devriez plutôt utiliser ip4.me site au lieu de cela, parce que votre (vos clients) navigateur peut ne pas avoir une connectivité IPv6 et l'affichage Page not found dans ce cas.
Je vais ajouter une solution, car les autres n'étaient pas tout à fait bon pour moi parce qu'ils:
doivent être exécutés sur un serveur avec un nom de domaine par exemple gethostbyname() (si vous pensez à ce sujet, vous n'avez pas réellement le problème si vous savez ce à priori)
ne peut pas être utilisé sur la CLI (compter sur quelque chose dans $_SERVER à être définie par un serveur web)
assumer un format spécifique de ifconfig sortie, ce qui peut inclure de multiples non-public des interfaces
dépendent de l'analyse de quelqu'un site web (qui peut disparaître, changer l'URL, changer de format, de commencer de vous mentir, etc, le tout sans avis)
C'est ce que je suggère:
$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
L'adresse IP il y a un Google public DNS serveur. J'ai confiance qu'ils vont être autour et en cours d'exécution pendant un certain temps. Il ne devrait vraiment pas d'importance ce que l'adresse vous utilisez aussi longtemps que ses une adresse IP publique qui appartient à quelqu'un qui n'a pas l'esprit aléatoire tentatives de connexion trop (vous peut-être?).
Il est basé sur un réponse je suis tombé quand j'ai eu un problème similaire en Python.
P. S.: je ne suis pas sûr de savoir comment bien la partie ci-dessus s'il y a de la sorcellerie entre votre ordinateur et l'internet.
Meilleure option ! 🙂 Cela devrait être accepté, d'autres solutions, mais je doute qu'elles seront toujours autour de 10 ans à partir de maintenant. Google est certainement va être là pour un moment... Désolé, mais cela ne me donne pas l'adresse publique comme l'ip6.moi la version ci-dessus. Cela m'a donné mon adresse interne 🙁
Je sais que cette question est vieille et longue réponse, mais j'ai été googler pour la même chose, et souhaitez ajouter mon propre "hack". Pour que cela fonctionne, votre webrequest a à venir à partir d'une adresse IP externe ou vous devez modifier $own_url à une url qui ne à une demande externe à lui-même.
Le point est, si vous laissez le script de faire une demande pour lui-même que vous l'obtenez l'adresse IP externe.
En supposant que le PHP est exécuté sur un serveur Linux, vous pouvez appeler à l'aide de la commande ifconfig PHP de la fonction exec. Cela donnera IP publique sans avoir besoin de contacter un site externe/service. E. g.:
Noter que, parfois, $commande, vous devez spécifier le chemin complet de la commande ifconfig. Vous pouvez le trouver en exécution de
whereis ifconfig
à partir de l'invite du shell. En outre $interface doit être défini sur le nom de votre serveur principal de l'interface réseau qui a le lien vers le WAN.
Sur Windows, vous pouvez faire quelque chose de similaire, bien sûr, à l'aide de la commande ipconfig au lieu de ifconfig (et correspondant ajusté regex).
Vous pouvez également utiliser SERVER_NAME au lieu de HTTP_HOST si l'un des deux ne donne pas ce que vous voulez.
Toutefois, cela suppose que votre serveur est correctement configuré dans la correspondance avec les DNS. Cela peut ne pas toujours être le cas. Voir mon autre réponse à l'aide de la commande ifconfig qui est peut-être mieux.
Je pense qu'il y a beaucoup de code pour ce genre de choses dans d'autres réponses, mais ma réponse est courte, mais vous aurez besoin d'exécuter une commande shell pour obtenir l'adresse ip...
mais il est court et rapide, je pense que...
php exécuter bash > bash run > bash obtenir ip > php get ip
Simplement des requêtes sur un hôte qui renvoie votre adresse IP:
ou, mettre en place un service que le simple fait écho simplement l'adresse IP, et de l'utiliser comme ceci:
Mettre en place le service vous-même simplement en faisant écho à l'adresse IP distante, ou de payer quelqu'un pour l'héberger. Ne pas utiliser de quelqu'un d'autre serveur sans l'autorisation. Auparavant, cette réponse liée à un service de mine qui est maintenant frapper plusieurs fois par seconde.
Noter que dans un réseau IP avec un ou plusieurs NATs, vous pouvez avoir plusieurs adresses IP externes. Cela vous donnera juste l'un d'eux.
Aussi, cette solution dépend bien sûr de l'hôte distant. Cependant, puisqu'il n'est pas largement mis en œuvre standard (pas de fournisseur de services internet et seulement certains routeurs mettre en œuvre UPnP), il n'y a pas d'autre moyen pour obtenir votre adresse IP externe. Même si vous pourriez nous parler de votre local NAT, vous ne pouvez pas être sûr qu'il n'y a pas d'autre NAT derrière elle.
Eh bien, vous pourriez certainement secours à une autre adresse. Mais en général, il n'y a pas d'autre moyen si vous êtes derrière un NAT ou un autre type de tunnel.
Si il y a des fonctionnalités au sein de votre application où l'adresse IP distante est essentiel, il doit être réglé dans une configuration quelque part plutôt que par un service externe.
C'est " la triste vérité. Oubliez les superglobales, les variables d'environnement de l'hôte ou IP qui lui est associée est "réel", le contact est la seule façon d'obtenir l'adresse IP actuelle.
Le
[
est de permettre à des crochets, qui sont souvent utilisés pour délimiter les adresses IPv6. La finale<
est en effet en option, et rend le code plus robuste si le format doit changer.OriginalL'auteur phihag
Il n'existe AUCUN moyen pour obtenir votre Adresse IP sous-jacente qui a été désigné par votre fournisseur de services internet via classiques PHP si vous utilisez un routeur. Un moyen d'obtenir l'adresse IP externe est de trouver un service qui permettra de l'obtenir pour vous d'écho et de l'adresse de retour pour vous. J'ai trouvé un service pratique qui ne fait que cela. http://ipecho.net/
Vous pouvez utiliser:
Les deux premières phrases se contredisent l'une l'autre. Il ne peut pas être "no way", puis un "seul moyen". Aussi, "SEULEMENT" est un très mot fort.
OriginalL'auteur Ben
Vous pu analyser à partir d'un service comme ip6.moi:
ip4.me
site au lieu de cela, parce que votre (vos clients) navigateur peut ne pas avoir une connectivité IPv6 et l'affichagePage not found
dans ce cas.OriginalL'auteur Patrick Moore
Je vais ajouter une solution, car les autres n'étaient pas tout à fait bon pour moi parce qu'ils:
gethostbyname()
(si vous pensez à ce sujet, vous n'avez pas réellement le problème si vous savez ce à priori)$_SERVER
à être définie par un serveur web)ifconfig
sortie, ce qui peut inclure de multiples non-public des interfacesC'est ce que je suggère:
L'adresse IP il y a un Google public DNS serveur. J'ai confiance qu'ils vont être autour et en cours d'exécution pendant un certain temps. Il ne devrait vraiment pas d'importance ce que l'adresse vous utilisez aussi longtemps que ses une adresse IP publique qui appartient à quelqu'un qui n'a pas l'esprit aléatoire tentatives de connexion trop (vous peut-être?).
Il est basé sur un réponse je suis tombé quand j'ai eu un problème similaire en Python.
P. S.: je ne suis pas sûr de savoir comment bien la partie ci-dessus s'il y a de la sorcellerie entre votre ordinateur et l'internet.
Cela devrait être accepté, d'autres solutions, mais je doute qu'elles seront toujours autour de 10 ans à partir de maintenant. Google est certainement va être là pour un moment...
Désolé, mais cela ne me donne pas l'adresse publique comme l'ip6.moi la version ci-dessus.
Cela m'a donné mon adresse interne 🙁
OriginalL'auteur jeteon
Vous pouvez essayer ceci:
pour obtenir l'adresse IP associée à votre nom de domaine.
OriginalL'auteur jakx
Je sais que cette question est vieille et longue réponse, mais j'ai été googler pour la même chose, et souhaitez ajouter mon propre "hack". Pour que cela fonctionne, votre webrequest a à venir à partir d'une adresse IP externe ou vous devez modifier
$own_url
à une url qui ne à une demande externe à lui-même.Le point est, si vous laissez le script de faire une demande pour lui-même que vous l'obtenez l'adresse IP externe.
OriginalL'auteur Martin
Si votre serveur d'avoir un nom de domaine, vous pouvez exécuter la commande ping ou vous pouvez utiliser:
Votre adresse IP externe.
OriginalL'auteur Codebeat
En supposant que le PHP est exécuté sur un serveur Linux, vous pouvez appeler à l'aide de la commande ifconfig PHP de la fonction exec. Cela donnera IP publique sans avoir besoin de contacter un site externe/service. E. g.:
Noter que, parfois, $commande, vous devez spécifier le chemin complet de la commande ifconfig. Vous pouvez le trouver en exécution de
à partir de l'invite du shell. En outre $interface doit être défini sur le nom de votre serveur principal de l'interface réseau qui a le lien vers le WAN.
Sur Windows, vous pouvez faire quelque chose de similaire, bien sûr, à l'aide de la commande ipconfig au lieu de ifconfig (et correspondant ajusté regex).
OriginalL'auteur Arthur
Vous pouvez également obtenir IP via DNS UN enregistrement basé sur le nom d'hôte ou un nom de serveur:
Vous pouvez également utiliser SERVER_NAME au lieu de HTTP_HOST si l'un des deux ne donne pas ce que vous voulez.
Toutefois, cela suppose que votre serveur est correctement configuré dans la correspondance avec les DNS. Cela peut ne pas toujours être le cas. Voir mon autre réponse à l'aide de la commande ifconfig qui est peut-être mieux.
OriginalL'auteur Arthur
Je pense qu'il y a beaucoup de code pour ce genre de choses dans d'autres réponses, mais ma réponse est courte, mais vous aurez besoin d'exécuter une commande shell pour obtenir l'adresse ip...
mais il est court et rapide, je pense que...
php exécuter bash > bash run > bash obtenir ip > php get ip
Référence: Comment puis-je obtenir mon adresse IP externe dans un script shell?
OriginalL'auteur DarckBlezzer
Avez-vous essayé:
?
php_uname('n')
retourne dans la plupart des cas, le interne adresse IP, c'est à dire basés sur LAN. L'OP est demandé pour un externe.OriginalL'auteur Krunoslav Djakovic