我想那是因为 127.0.0.1 不是真正的private
IP 范围,而是loopback
IP 范围,如此处所述
通常,当 TCP/IP 应用程序想要发送信息时,该信息会沿协议层向下传输到 IP,然后封装在 IP 数据报中。然后,该数据报向下传递到设备物理网络的数据链路层,以便在到达 IP 目的地的途中传输到下一跳。
但是,为回送功能预留了一个特殊的地址范围。这是 127.0.0.0 到 127.255.255.255 的范围。主机发送到 127.xxx 环回地址的 IP 数据报不会向下传递到数据链路层进行传输。相反,它们在 IP 级别“环回”到源设备。本质上,这代表了普通协议栈的“短路”;数据由设备的第三层 IP 实现发送,然后立即被设备接收。
环回范围的目的是测试主机上的 TCP/IP 协议实现。由于较低层是短路的,因此发送到环回地址可以有效地测试较高层(IP 及以上),而不会在较低层出现问题。127.0.0.1 是最常用于测试目的的地址。
过滤器标志手册对此特定问题有评论。
<?php
function FILTER_FLAG_NO_LOOPBACK_RANGE($value) {
// Fails validation for the following loopback IPv4 range: 127.0.0.0/8
// This flag does not apply to IPv6 addresses
return filter_var($value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) ? $value :
(((ip2long($value) & 0xff000000) == 0x7f000000) ? FALSE : $value);
}
$var = filter_var('127.0.0.1', FILTER_CALLBACK, array('options' => 'FILTER_FLAG_NO_LOOPBACK_RANGE'));
// Returns FALSE
$var = filter_var('74.125.19.103', FILTER_CALLBACK, array('options' => 'FILTER_FLAG_NO_LOOPBACK_RANGE'));
// Returns '74.125.19.103'
// To filter Private IP ranges and Loopback ranges
$var = filter_var('127.0.0.1', FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE) && filter_var('127.0.0.1', FILTER_CALLBACK, array('options' => 'FILTER_FLAG_NO_LOOPBACK_RANGE'));
// Returns FALSE
?>