Я столкнулся с проблемой с $ _SERVER ['REMOTE_ADDR'] в PHP. Он дает значение IPv6, даже если сервер использует IPv4.
Может ли кто-нибудь помочь мне решить эту проблему.
Затем сервер принимает соединения на сокет IPv6. Некоторые операционные системы могут выполнять как IPv4, так и IPv6 в гнезде IPv6. Когда это произойдет, адрес IPv6 будет выглядеть так ::ffff:c000:027b
или ::ffff:c000:027b
который является тем же адресом, но написанным в шестнадцатеричном формате.
Если вы видите адреса IPv6, такие как 2a00:8640:1::224:36ff:feef:1d89
то ваш веб-сервер действительно доступен по IPv6 🙂
В любом случае, чтобы преобразовать все в каноническую форму, вы можете использовать что-то вроде:
// Known prefix $v4mapped_prefix_hex = '00000000000000000000ffff'; $v4mapped_prefix_bin = pack("H*", $v4mapped_prefix_hex); // Or more readable when using PHP >= 5.4 # $v4mapped_prefix_bin = hex2bin($v4mapped_prefix_hex); // Parse $addr = $_SERVER['REMOTE_ADDR']; $addr_bin = inet_pton($addr); if( $addr_bin === FALSE ) { // Unparsable? How did they connect?!? die('Invalid IP address'); } // Check prefix if( substr($addr_bin, 0, strlen($v4mapped_prefix_bin)) == $v4mapped_prefix_bin) { // Strip prefix $addr_bin = substr($addr_bin, strlen($v4mapped_prefix_bin)); } // Convert back to printable address in canonical form $addr = inet_ntop($addr_bin);
Используя этот код, при вводе одного из следующих значений:
::ffff:192.000.002.123 ::ffff:192.0.2.123 0000:0000:0000:0000:0000:ffff:c000:027b ::ffff:c000:027b ::ffff:c000:27b 192.000.002.123 192.0.2.123
вы всегда получаете канонический IPv4-адрес 192.0.2.123
качестве вывода.
И, конечно, адреса IPv6 возвращаются как канонические адреса IPv6: 2a00:8640:0001:0000:0224:36ff:feef:1d89
становится 2a00:8640:1::224:36ff:feef:1d89
и т. Д.