use Data::Validate::IP qw(is_ip is_public_ip is_loopback_ip); my($valid_ip, $valid_public); my @IPs; if (defined $ENV{HTTP_X_FORWARDED_FOR}) { @IPs=split /,/, $ENV{HTTP_X_FORWARDED_FOR}; }; push(@IPs, $ENV{REMOTE_ADDR}); foreach my $check (@IPs) { # trim whitespaces $check =~ s/\s//g; # skip if not a valid IP next unless is_ip($check); # overwrite with last valid IP #$valid_ip //= $check; # select first valid ip $valid_ip = $check; # skip unless it's a public, loopback or proxy IP next if (not is_public_ip($check)) or (is_loopback_ip($check)) or ($check eq "192.0.2.90"); # overwrite with the last valid public IP $valid_public = $check; # select first public IP last; } # select public IP, if we found one, else last valid IP my $ip = $valid_public // $valid_ip; print "Content-type: text/html\nCache-Control: max-age=0,no-cache,no-store,post-check=0,pre-check=0\n\nCurrent IP CheckCurrent IP Address: $ip";