I have a script which sends a request to another server but problem is that IPv6
does not supported so if I send IPv6
then give error so i need this one of two:
- Get
IPv4
address all time or - Get both
IPv4
andIPv6
addresses
I use this code to get the IP
address
function getRealIP[]
{
if [isset[$_SERVER["HTTP_CLIENT_IP"]]] {
$ip = $_SERVER["HTTP_CLIENT_IP"];
} elseif [isset[$_SERVER["HTTP_X_FORWARDED_FOR"]]] {
$ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
} elseif [isset[$_SERVER["HTTP_X_FORWARDED"]]] {
$ip = $_SERVER["HTTP_X_FORWARDED"];
} elseif [isset[$_SERVER["HTTP_FORWARDED_FOR"]]] {
$ip = $_SERVER["HTTP_FORWARDED_FOR"];
} elseif [isset[$_SERVER["HTTP_FORWARDED"]]] {
$ip = $_SERVER["HTTP_FORWARDED"];
} else {
$ip = $_SERVER["REMOTE_ADDR"];
}
// Strip any secondary IP etc from the IP address
if [strpos[$ip, ','] > 0] {
$ip = substr[$ip, 0, strpos[$ip, ',']];
}
return $ip;
}
But this function only returns one IPv
address. How can I get all time IPv4
or get both addresses?
squancy
5551 gold badge6 silver badges24 bronze badges
asked Jul 9, 2018 at 11:58
Shafiqul IslamShafiqul Islam
5,4552 gold badges34 silver badges42 bronze badges
8
A client will send a request to your server using only one protocol. It doesn't send the request using both IPv4 and IPv6 at the same time, and there's no way to interleave both protocols, and IPv4 addresses also don't translate into equivalent IPv6 addresses. If the client sent the request using IPv4, then you'll get the IPv4 address. If they sent the request using IPv6, you'll get the IPv6 address. Period. End of story.
If you require an IPv4 address, then you have to disable IPv6 support on your server/DNS entry, so all clients are forced to use IPv4 as the only available protocol. But that would also be a terrible step backwards in this day and age.
answered Jul 9, 2018 at 12:05
6
You can't.
Only the IP address the request came from is available.
There's no reliable way to identify other IP addresses [my laptop currently has 12 IP addresses] that route to the same computer.
answered Jul 9, 2018 at 12:03
QuentinQuentin
874k121 gold badges1171 silver badges1285 bronze badges
3
There is an API for this available //ipv6-test.com/api/ however their server has a CORS misconfiguration making it not work at the moment.
answered Aug 31 at 22:09
JayJay
1,04611 silver badges22 bronze badges
Sau khi tìm kiếm xung quanh một cách kỹ lưỡng, tôi nhận thấy có một chút thiếu các chức năng trong PHP để xử lý IPv6 . Vì sự hài lòng của cá nhân tôi, tôi đã tạo một vài chức năng để trợ giúp quá trình chuyển đổi.
Các IPv6ToLong[]
chức năng là một giải pháp tạm thời để mà lớn lên ở đây: Làm thế nào để lưu trữ địa chỉ IPv6 tương thích trong một cơ sở dữ liệu quan hệ . Nó sẽ chia IP thành hai số nguyên và trả về chúng trong một mảng.
/**
* Convert an IPv4 address to IPv6
*
* @param string IP Address in dot notation [192.168.1.100]
* @return string IPv6 formatted address or false if invalid input
*/
function IPv4To6[$Ip] {
static $Mask = '::ffff:'; // This tells IPv6 it has an IPv4 address
$IPv6 = [strpos[$Ip, '::'] === 0];
$IPv4 = [strpos[$Ip, '.'] > 0];
if [!$IPv4 && !$IPv6] return false;
if [$IPv6 && $IPv4] $Ip = substr[$Ip, strrpos[$Ip, ':']+1]; // Strip IPv4 Compatibility notation
elseif [!$IPv4] return $Ip; // Seems to be IPv6 already?
$Ip = array_pad[explode['.', $Ip], 4, 0];
if [count[$Ip] > 4] return false;
for [$i = 0; $i < 4; $i++] if [$Ip[$i] > 255] return false;
$Part7 = base_convert[[$Ip[0] * 256] + $Ip[1], 10, 16];
$Part8 = base_convert[[$Ip[2] * 256] + $Ip[3], 10, 16];
return $Mask.$Part7.':'.$Part8;
}
/**
* Replace '::' with appropriate number of ':0'
*/
function ExpandIPv6Notation[$Ip] {
if [strpos[$Ip, '::'] !== false]
$Ip = str_replace['::', str_repeat[':0', 8 - substr_count[$Ip, ':']].':', $Ip];
if [strpos[$Ip, ':'] === 0] $Ip = '0'.$Ip;
return $Ip;
}
/**
* Convert IPv6 address to an integer
*
* Optionally split in to two parts.
*
* @see //stackoverflow.com/questions/420680/
*/
function IPv6ToLong[$Ip, $DatabaseParts= 2] {
$Ip = ExpandIPv6Notation[$Ip];
$Parts = explode[':', $Ip];
$Ip = array['', ''];
for [$i = 0; $i < 4; $i++] $Ip[0] .= str_pad[base_convert[$Parts[$i], 16, 2], 16, 0, STR_PAD_LEFT];
for [$i = 4; $i < 8; $i++] $Ip[1] .= str_pad[base_convert[$Parts[$i], 16, 2], 16, 0, STR_PAD_LEFT];
if [$DatabaseParts == 2]
return array[base_convert[$Ip[0], 2, 10], base_convert[$Ip[1], 2, 10]];
else return base_convert[$Ip[0], 2, 10] + base_convert[$Ip[1], 2, 10];
}
Đối với những hàm này, tôi thường triển khai chúng bằng cách gọi hàm này trước:
/**
* Attempt to find the client's IP Address
*
* @param bool Should the IP be converted using ip2long?
* @return string|long The IP Address
*/
function GetRealRemoteIp[$ForDatabase= false, $DatabaseParts= 2] {
$Ip = '0.0.0.0';
if [isset[$_SERVER['HTTP_CLIENT_IP']] && $_SERVER['HTTP_CLIENT_IP'] != '']
$Ip = $_SERVER['HTTP_CLIENT_IP'];
elseif [isset[$_SERVER['HTTP_X_FORWARDED_FOR']] && $_SERVER['HTTP_X_FORWARDED_FOR'] != '']
$Ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
elseif [isset[$_SERVER['REMOTE_ADDR']] && $_SERVER['REMOTE_ADDR'] != '']
$Ip = $_SERVER['REMOTE_ADDR'];
if [[$CommaPos = strpos[$Ip, ',']] > 0]
$Ip = substr[$Ip, 0, [$CommaPos - 1]];
$Ip = IPv4To6[$Ip];
return [$ForDatabase ? IPv6ToLong[$Ip, $DatabaseParts] : $Ip];
}
Ai đó làm ơn cho tôi biết nếu tôi đang phát minh lại bánh xe ở đây hay tôi đã làm sai điều gì đó.
Việc triển khai này chuyển đổi IPv4 thành IPv6. Bất kỳ địa chỉ IPv6 nào nó cũng không chạm vào.
32 hữu ích 2 bình luận 49k xem chia sẻ