PHP에서 서버 IP 주소를 식별하는 방법


122

PHP에서 서버 IP 주소를 어떻게 식별 할 수 있습니까?


2
요청 IP 주소 또는 앱을 실행하는 컴퓨터의 IP를 의미합니까?
wosis

답변:


175

서버 IP의 경우 다음과 같습니다.

$_SERVER['SERVER_ADDR'];

그리고 이것은 항구를 위해

$_SERVER['SERVER_PORT'];

9
일부 공유 호스트이 반환 :: 1 일 호
TheRealChx101

3
웹 서버 앞에서 사용중인 Load Balancer에 따라 이는 올바르지 않을 수 있습니다. 이 시나리오에서도 X-Forwarded-For 헤더를
원합니다

31
이것은 서버 주소가 아닙니다! 이것은 원격 브라우저가 원격 사용자가 제어하는 ​​서버를 호출 하는 주소 입니다. John K대신 답을 사용하세요
Ariel

이것은 서버 IP를 제공하지 않습니다. 어떤 이유로 내 로컬 IP주고있다
토마스 윌리엄스

또한 php-fpm 서버 주소를 제공하지 않지만 관련 웹 서버 (nginx, apache) 용입니다. 따라서 mysql-client 호스트 사양 (user @ host)에는 올바르지 않습니다.
scipilot

105

PHP 버전 5.3 이상을 사용하는 경우 다음을 수행 할 수 있습니다.

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

이것은 웹 서버를 통해 실행되지 않고 독립 실행 형 스크립트를 실행할 때 잘 작동합니다.


완벽 해, 내가 찾고있는 것. 감사합니다 존
프랭크

6
+1 이것은 명령 줄에서 작동하는 유일한 솔루션입니다.
Adam Elsodaney 2014

2
@andreas 안돼. 로컬 호스트 이름은 /etc/hosts파일에 있어야하며 빠를 것 127.0.0.1입니다. DNS를 호출해야한다면 말한 것처럼 느려질 것입니다.
Ariel

+1하지만 질문입니다 .. 로컬 서버에서 xampp로 시도하고 ip 192.168etc를 반환하지만 .. 127.0.0.1 no ??
Andrea Bori

이것은 나를 위해 작동하지만 일부 컴퓨터에는 도메인 이름이 표시됩니다. 이 문제를 해결하는 방법.
Dharani Dharan 2015

19

예를 들면 :

$_SERVER['SERVER_ADDR']

IIS에서 다음을 시도하십시오.

$_SERVER['LOCAL_ADDR']

2
$_SERVER['LOCAL_ADDR']PHP가 CGI 모듈로 실행되는 경우 IIS에서만 사용할 수 있습니다.
Rudi Visser 2011

@rudi_visser는 fastcgi에서도 작동하지만 locahost를 통해 연결하면 대신 :: 1이 반환됩니다. 서버의 이름이나 IP를 통해 연결하면 실제 IP를 다시 얻을 수 있습니다.
starbeamrainbowlabs

@starbeamrainbowlabs FastCGI CGI입니다 :) ISAPI 모듈로 실행하는 것과는 대조적으로 이것은 FastCGI가 안정적인 플랫폼으로 등장하기 전에 작성되었습니다.
Rudi Visser 2012

같은 : 1 모습은 아마 IP6 주소인지 @starbeamrainbowlabs 아무것도
토비 알렌

@TobyAllen 감사합니다 :). 이상한 점은 내 네트워크가 ipv6을 지원하지 않지만 내 서버 (Windows 7 시스템)가 IP를 ipv6 루프백 주소 인 :: 1로보고한다는 것입니다.
starbeamrainbowlabs

13

나에게 연결하는 원격 컴퓨터 중 하나가 아닌 내 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;

( Linux 및 OS X에서 로컬 컴퓨터의 기본 IP 주소를 얻는 방법 에서 뻔뻔스럽게 조정 된 것은? )


이것은 쉘에서 PHP 스크립트를 실행할 때 실제로 작동하는 유일한 옵션입니다. 질문 : 활성 인터페이스가 여러 개인 경우 반환 할 주소를 어떻게 결정합니까? 유선 및 무선 이더넷 연결이 활성화 된 상태에서 테스트 한 다음 무선 만 활성화 된 상태에서 테스트했는데 두 번 모두 wlan ip를 반환합니다. 좋은 스크립트, 감사합니다!
Ryan Griggs

실제로 어떤 것을 반환할지 모릅니다. ifconfig의 출력에서 ​​마지막 inet 인터페이스를 반환하지만 127.0.0.1은 무시합니다. "평범한"인터페이스 만 가지고 있다면 꽤 좋은 일입니다. "ifconfig wlan0 | ..."을 원하는 인터페이스를 지정하는 것이 가장 안전합니다. 이 스크립트는 완벽하지는 않지만 간단한 설정에서 작동하며 원칙적으로 필요에 따라 조정하는 방법을 보여줍니다.
Dom

1
ifconfig | grep 'inet addr'| cut -d ':'-f 2 | awk '{print $ 1}'| grep -vE '^ (192 \ .168 | 10 \. | 172 \ .1 [6789] \. | 172 \ .2 [0-9] \. | 172 \ .3 [01] \. | 127 \. ) '는 나의 최근 개정판입니다. 모든 로컬 IP를 필터링하고 외부 만 제공합니다
Dom

저는 여러 네트워크 인터페이스를 가지고 있습니다.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\.'
Jonathan

10

가장 많이 찬성 된 답변 중 어느 것도 서버의 공개 주소를 안정적으로 반환하지 않습니다. 일반적으로 $_SERVER['SERVER_ADDR']정확하지만 VPN을 통해 서버에 액세스하는 경우 공용 주소가 아닌 내부 네트워크 주소를 반환 할 가능성이 높으며 동일한 네트워크에 있지 않더라도 일부 구성은 단순히 비어 있거나 다른 일부가 지정됩니다. 값.

마찬가지로 $host= gethostname(); $ip = gethostbyname($host);DNS (내부 구성 또는 외부 레코드)와 서버의 호스트 이름 설정을 모두 사용하여 서버의 IP 주소를 추정하기 때문에 올바른 값을 반환하지 않는 시나리오가 있습니다 . 이 두 단계 모두 잠재적으로 결함이 있습니다. 예를 들어 서버의 호스트 이름이 도메인 이름 (예 HOSTNAME=yahoo.com:) 과 같은 형식 이면 (적어도 내 php5.4 / Centos6 설정에서) gethostbyname로컬 서버가 아닌 Yahoo.com의 주소를 찾는 것으로 바로 건너 뜁니다.

또한 gethostbyname퍼블릭 DNS 레코드에 폴백 되기 때문에 게시되지 않았거나 잘못된 퍼블릭 DNS 레코드가있는 테스트 서버 (예 : localhost또는 IP 주소로 서버에 액세스 하거나 로컬 hosts파일을 사용하여 퍼블릭 DNS를 재정의하는 경우 ) IP 주소가 반환되지 않거나 (단지 호스트 이름 만 반환 됨) 더 나쁜 경우 공용 DNS 레코드가 있거나 도메인에 대한 와일드 카드가있는 경우 잘못된 주소를 반환합니다.

상황에 따라 다음과 같이 세 번째 접근 방식을 시도 할 수도 있습니다.

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

여기에는 자체 결함이 있으며 (특정 타사 사이트에 의존하며, 다른 호스트 또는 프록시를 통해 아웃 바운드 연결을 라우팅하는 네트워크 설정이 gethostbyname있을 수 있음) 속도가 느릴 수 있습니다. 솔직히 어떤 접근 방식이 가장 자주 옳은지는 모르겠지만, 명심해야 할 교훈은 특정 시나리오 / 구성으로 인해 이러한 모든 접근 방식에 대해 잘못된 출력이 발생한다는 것입니다. 가능하면 접근 방식을 확인하십시오. 사용하면 예상 한 값이 반환됩니다.


9

이것은 서버에 설치된 컬에 대해 걱정하지 않고 위의 예를 적용하여 사용할 수있는 것입니다.

<?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);
    ?>


5

bash 쉘에서 PHP를 사용하는 경우 다음을 사용할 수 있습니다.

$server_name=exec('hostname');

때문에 $_SERVER[] SERVER_ADDR, HTTP_HOST그리고 SERVER_NAME설정되어 있지 않습니다.


4

이전 답변은 모두 $ _SERVER [ 'SERVER_ADDR']을 제공합니다. 일부 IIS 설치에서는 작동하지 않습니다. IIS에서이 작업을 수행하려면 다음을 사용하십시오.

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

2

나는 이것이 나를 위해 작동한다는 것을 알았다. GetHostByName ( "");

Apache 웹 서버를 실행하는 Windows 7에서 XAMPP v1.7.1을 실행합니다. 불행히도 내 게이트웨이 IP 주소를 제공합니다.


2

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']; }

1
$serverIP = $_SERVER["SERVER_ADDR"];
echo "Server IP is: <b>{$serverIP}</b>";

1

$HTTP_SERVER_VARS['server_ADDR']위의 답변에서 아무것도 얻지 못하고 이전 버전의 PHP 를 사용하는 경우 사용해야 할 수 있습니다.


0

$ _SERVER 어레이 확인

echo $_SERVER['SERVER_ADDR'];

1
그것은 "실제 IP"를 찾지 못하고 , 누구든지 설정할 수있는 임의의 확인되지 않은 HTTP 헤더를 찾아 내고 당신이 선호한다면 누구든지 자신의 IP를 스푸핑하는데 사용할 수 있습니다. 클라이언트가 프록시 뒤에 있으면 HTTP 헤더를 신뢰하지 마십시오. 이것은 또한 질문에 전혀 맞지 않습니다.
deceze

2
이 답변이 어떻게 질문에 전혀 맞지 않는지 알 수 없습니다. 질문은 "PHP에서 서버 IP 주소를 어떻게 식별 할 수 있습니까?"였습니다. OP가 더 잘 묻는 방법을 배워야하거나 질문을 읽는 방법을 배워야합니다. 게다가 클라이언트가 프록시 뒤에 있으면 서버 측에서 무엇을 시도하든 여전히 엉망입니다. X-FORWARDED-FOR 헤더로 확인할 수 있기 때문에 완전히 다른 시나리오는 서버가 프록시 뒤에있는 경우입니다.
Luis Masuelli

@deceze $_SERVER["SERVER_ADDR"]는 HTTP 헤더와 관련 이 없습니다. 이것은 서버 소프트웨어로 채워지며 $ _SERVER의 모든 HTTP 관련 항목에는 HTTP_ 접두사가 붙습니다. php.net/manual/en/reserved.variables.server.php
poncha

@poncha 내 댓글 은이 게시물 의 원래 개정판 과 관련이 있습니다.
deceze

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.