I would like to get the client IP address in IPv4 using the PHP super-global $_SERVER['REMOTE_ADDR']
. However, when I test it on my localhost, it returns an IPv6 address like ::1
.
I use Mac OS default Apache server. Is this related? If so, may I know how to force it to use the IPv4 format instead?
It is always the client that decides which protocol to use, not the server. The client determines the available protocols by looking up the hostname. Often this means that it will look in /etc/hosts to see if the name is defined there. If it is not then it will use a DNS request to resolve the name.
On Mac OS X the name localhost is defined in /etc/hosts, and because it contains both an IPv4 (127.0.0.1) and an IPv6 address (::1) the client is told that it can use both. If you want to use IPv4-only for testing you can add a name to /etc/hosts. If it is for deployment then you'll have to make sure that the DNS server only replies with an IPv4 address. And you'll have to adjust your Apache configuration to match the correct hostname of course.
But this is all just working around the problem: you need to be able to deal with IPv6 addresses.
IPv6 is being adopted all over the world, and an IPv6 address showing up on your localhost is just one tiny example of that. All datacentres I do business with provide IPv6 for hosting servers. Almost 10% of Romania has IPv6 in their homes. Almost 2% of the US has IPv6 in their homes. There are already at least four ISPs here in the Netherlands that offer IPv6 to their users. Etc.
If you don't provide support for IPv6 in your projects now then there is a large chance that something will break in 1 or 2 years, if not sooner.