2012-01-19 5 views
1

PHP에 익숙하지 않지만 프로덕션 문제가 해결 될 때까지 내부 사용자를 일시적으로 리디렉션 할 수있는 간단한 페이지를 만들어야합니다.내부 IP 주소 인 경우 사용자 리디렉션

사용자의 IP 주소가 "10.", "192." 또는 "172."으로 시작하는 경우 다른 서버로 리디렉션해야합니다. 사용자의 IP 주소가이 기준을 충족하지 못하면 유지 관리를 위해 사이트가 다운되었음을 사용자에게 알리는 메시지를 표시해야합니다.

누군가가 도와 줄 수 있습니까?

+5

레코드의 경우 '192.12.1'또는 '1722.'로 시작하는 모든 주소가 내부/개인 주소는 아닙니다. – webbiedave

+0

@webbiedave 사실이라고 알고 있지만, IP 네트워크를 유지하는 것이 주 업무이기 때문에 불만스러운 정확한 규칙을 모릅니다. 규칙이 실제로 무엇인지에 대한 신뢰할 수있는 출처에 대한 링크가 있습니까? 필자는 상충되는 것을 보거나 들었지만, 필자가 읽은 모든 공식 문서는 내부 사용을 위해 예약 된 주소 범위를 실제로 명시 적으로 설정하지는 않지만 일부는 있어야합니다. 예를 들어, 사람들은 '192.168.0.0/16'을 내부로 사용하는 경향이 있지만 '192'는 실제로 C 클래스 주소이므로 규칙 *이 더 제한적이어야합니다. – DaveRandom

+0

을 webbiedave에서 확장하려면 '어떤 숫자가 비공개 쿼리입니까?'- 참조 http://whatismyipaddress.com/private-ip에 대한 '192.168. *. *'및'172.16.0.0 - 172.31.255.255' – KevinDTimm

답변

2
$chunks = explode('.', $_SERVER['REMOTE_ADDR']); 
$whitelist = array(10, 192, 172); 
$server = "http://example.com"; 
if(in_array($chunks[0], $whitelist)) 
{ 
    //redirect to another server 
    header("Location: " . $server); 
    die(); 
} 
else 
{ 
    //Show maintenance message 
    die("The site is down for maintenance."); 
} 
6

당신은, 사용자의 주소 ($_SERVER['REMOTE_ADDR'])는 10.로 시작하는지 192., 또는 172.preg_match()를 사용할 수 있습니다

if(preg_match('/^(10|192|172)\./', $_SERVER['REMOTE_ADDR'])) 
{ 
    header('Location: http://example.com'); 
    die; 
} 
echo 'Site down for maintenance.'; 
+0

팀, 오, 당신은 우리에게 기회를 줘야 해 !! –

+0

사용자가 공용 DNS를 사용하는 사이트로 이동하는 경우 사용자 공용 IP를 반환하지 않겠습니까? – DWils

0
<?php 

    // Settings 
    $toRedirect = array (10, 172, 192); 
    $redirectAddress = 'http://wherever.com/'; 
    $maintenanceMessage = 'The site is down for maintenance'; 

    // Split the IP address into octets 
    list($oct1, $oct2, $oct3, $oct4) = explode('.', $_SERVER['REMOTE_ADDR']); 

    // Send local clients to redirect address 
    if (in_array($oct1, $toRedirect)) { 
    header('HTTP/1.1 307 Temporary Redirect'); 
    header('Location: '.$redirectAddress); 
    } 

    // Exit with the maintenance message. 
    // We can send this everyone in case the redirect fails 
    exit($maintenanceMessage); 
+0

의 $ _SERVER [ 'REMOTE_ADDR']은 $ _SERVER [ 'REMOTE_ADDRESS']이 아닙니다. –

+0

실제로 고정되어 있습니다 :-) – DaveRandom

0

글쎄, 당신은이 작업을 수행 할 수 있습니다

$ip = $_SERVER['REMOTE_ADDR']; //get IP address 
$toRedirect = array(10,192,172); 
$parts = explode('.', $ip); 
$id = $parts[0]; 
if(in_array($id, $toRedirect)) { 
    //do redirect 
} 
1

신뢰할 수있는 로컬 IP 주소를 식별 할 수 없습니다. IPv4 주소의 첫 번째 옥텟을 통해 운 좋게도 PHP가이 모든 것을 처리했습니다. 나는 OP가 IPv4에 대해서만 묻는 것을 알고 있지만,이 솔루션은 IPv6과 예약 된 주소에 대해서도 다루고 있습니다.

/** 
* Function returns true if IP Address is identified as private or reserved 
* 
* Uses REMOTE_ADDR, a reliable source as TCP handshake is required, most others can be spoofed 
* 
* FILTER_FLAG_NO_PRIV_RANGE: 
*  Fails validation for the following private IPv4 ranges: 10.0.0.0/8, 172.16.0.0/12 and 192.168.0.0/16. 
*  Fails validation for the IPv6 addresses starting with FD or FC. 
* 
* FILTER_FLAG_NO_RES_RANGE: 
*  Fails validation for the following reserved IPv4 ranges: 0.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24 and 224.0.0.0/4. 
*  This flag does not apply to IPv6 addresses. 
*/ 
function isPrivateIp() 
{ 
    return !filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE); 
} 

/*Using function to get OP desired result*/ 
if (isPrivateIp() === true) { 
    $server = 'http://example.com'; 
    //redirect to another server 
    header("Location: $server"); 
} else { 
    //Show maintenance message 
    echo 'The site is down for maintenance.'; 
} 
exit;