PHP如何从服务器端判断客户端的代理类型。

我们假设客户端确实用了代理服务器,则PHP版的写法是:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
$ra = $_SERVER["REMOTE_ADDR"];
$hv = $_SERVER["HTTP_VIA"];
$fwd = $_SERVER["HTTP_X_FORWARDED_FOR"];
/*
fwd = "";
if($_SERVER['HTTP_X_FORWARDED_FOR'])
$fwd = $_SERVER['HTTP_X_FORWARDED_FOR'];
else if($_SERVER['HTTP_X_FORWARDED'])
$fwd = $_SERVER['HTTP_X_FORWARDED'];
else if($_SERVER['HTTP_FORWARDED_FOR'])
$fwd = $_SERVER['HTTP_FORWARDED_FOR'];
else if($_SERVER['HTTP_FORWARDED'])
$fwd = $_SERVER['HTTP_FORWARDED'];
else if($_SERVER['REMOTE_ADDR'])
$fwd = $_SERVER['REMOTE_ADDR'];
else
$fwd = '';
*/
// echo "HTTP_CLIENT_IP:", $_SERVER["HTTP_CLIENT_IP"], "<br />";
// echo "REMOTE_ADDR:", $ra, "<br />";
// echo "HTTP_VIA:", $hv, "<br />";
// echo "HTTP_X_FORWARDED_FOR:", $fwd, "<br />";
if(!empty($hv) || !empty($fwd))
{
if(!empty($fwd) && $fwd != $ra)
{
// Transparent Proxy or Distorting Proxy
$proxy_type = "transparent";
}
else
{
// Anonymous Proxy
$proxy_type = "anonymous";
}
}
else
{
// Elite Proxy or No Proxy
$proxy_type = "elite";
}
// Output
header("Content-type:text/json");
$dict = array("proxy_type" => $proxy_type, "REMOTE_ADDR" => "$ra", "HTTP_VIA" => "$hv", "HTTP_X_FORWARDED_FOR" => "$forward");
echo json_encode($dict);
echo "\n";
?>
<?php $ra = $_SERVER["REMOTE_ADDR"]; $hv = $_SERVER["HTTP_VIA"]; $fwd = $_SERVER["HTTP_X_FORWARDED_FOR"]; /* fwd = ""; if($_SERVER['HTTP_X_FORWARDED_FOR']) $fwd = $_SERVER['HTTP_X_FORWARDED_FOR']; else if($_SERVER['HTTP_X_FORWARDED']) $fwd = $_SERVER['HTTP_X_FORWARDED']; else if($_SERVER['HTTP_FORWARDED_FOR']) $fwd = $_SERVER['HTTP_FORWARDED_FOR']; else if($_SERVER['HTTP_FORWARDED']) $fwd = $_SERVER['HTTP_FORWARDED']; else if($_SERVER['REMOTE_ADDR']) $fwd = $_SERVER['REMOTE_ADDR']; else $fwd = ''; */ // echo "HTTP_CLIENT_IP:", $_SERVER["HTTP_CLIENT_IP"], "<br />"; // echo "REMOTE_ADDR:", $ra, "<br />"; // echo "HTTP_VIA:", $hv, "<br />"; // echo "HTTP_X_FORWARDED_FOR:", $fwd, "<br />"; if(!empty($hv) || !empty($fwd)) { if(!empty($fwd) && $fwd != $ra) { // Transparent Proxy or Distorting Proxy $proxy_type = "transparent"; } else { // Anonymous Proxy $proxy_type = "anonymous"; } } else { // Elite Proxy or No Proxy $proxy_type = "elite"; } // Output header("Content-type:text/json"); $dict = array("proxy_type" => $proxy_type, "REMOTE_ADDR" => "$ra", "HTTP_VIA" => "$hv", "HTTP_X_FORWARDED_FOR" => "$forward"); echo json_encode($dict); echo "\n"; ?>
<?php


$ra = $_SERVER["REMOTE_ADDR"];
$hv = $_SERVER["HTTP_VIA"];
$fwd = $_SERVER["HTTP_X_FORWARDED_FOR"];

/*
fwd = "";
if($_SERVER['HTTP_X_FORWARDED_FOR'])
    $fwd = $_SERVER['HTTP_X_FORWARDED_FOR'];
else if($_SERVER['HTTP_X_FORWARDED'])
    $fwd = $_SERVER['HTTP_X_FORWARDED'];
else if($_SERVER['HTTP_FORWARDED_FOR'])
    $fwd = $_SERVER['HTTP_FORWARDED_FOR'];
else if($_SERVER['HTTP_FORWARDED'])
    $fwd = $_SERVER['HTTP_FORWARDED'];
else if($_SERVER['REMOTE_ADDR'])
    $fwd = $_SERVER['REMOTE_ADDR'];
else
    $fwd = '';
*/

// echo "HTTP_CLIENT_IP:", $_SERVER["HTTP_CLIENT_IP"], "<br />";
// echo "REMOTE_ADDR:", $ra, "<br />";
// echo "HTTP_VIA:", $hv, "<br />";
// echo "HTTP_X_FORWARDED_FOR:", $fwd, "<br />";

if(!empty($hv) || !empty($fwd))
{
    if(!empty($fwd) && $fwd != $ra)
    {
        // Transparent Proxy or Distorting Proxy
        $proxy_type = "transparent";
    }
    else
    {
        // Anonymous Proxy
        $proxy_type = "anonymous";
    }
}
else
{
    // Elite Proxy or No Proxy
    $proxy_type = "elite";
}

// Output
header("Content-type:text/json");
$dict = array("proxy_type" => $proxy_type, "REMOTE_ADDR" => "$ra", "HTTP_VIA" => "$hv", "HTTP_X_FORWARDED_FOR" => "$forward");
echo json_encode($dict);
echo "\n";
?>

在文中,有一个很长的if/else,这是加强版判断forward字段的方法,可以根据需要自行设置。如果启用了这个后,一般elite都会被判为anonymous。

Leave a Reply

Your email address will not be published. Required fields are marked *