신뢰할 수있는 로컬 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;
레코드의 경우 '192.12.1'또는 '1722.'로 시작하는 모든 주소가 내부/개인 주소는 아닙니다. – webbiedave
@webbiedave 사실이라고 알고 있지만, IP 네트워크를 유지하는 것이 주 업무이기 때문에 불만스러운 정확한 규칙을 모릅니다. 규칙이 실제로 무엇인지에 대한 신뢰할 수있는 출처에 대한 링크가 있습니까? 필자는 상충되는 것을 보거나 들었지만, 필자가 읽은 모든 공식 문서는 내부 사용을 위해 예약 된 주소 범위를 실제로 명시 적으로 설정하지는 않지만 일부는 있어야합니다. 예를 들어, 사람들은 '192.168.0.0/16'을 내부로 사용하는 경향이 있지만 '192'는 실제로 C 클래스 주소이므로 규칙 *이 더 제한적이어야합니다. – DaveRandom
을 webbiedave에서 확장하려면 '어떤 숫자가 비공개 쿼리입니까?'- 참조 http://whatismyipaddress.com/private-ip에 대한 '192.168. *. *'및'172.16.0.0 - 172.31.255.255' – KevinDTimm