2009-10-30 9 views
0

Pourquoi ce retour de code "":getenv ("HTTP_XXX) retourner rien

$ip = ""; 
if(getenv("HTTP_CLIENT_IP")) 
{ 
$ip = getenv("HTTP_CLIENT_IP"); 
} elseif(getenv("HTTP_X_FORWARDED_FOR")) { 
$ip = getenv("HTTP_X_FORWARDED_FOR"); 
} else { 
$ip = getenv("REMOTE_ADDR"); 
} 

Environnement: W2003EE, IIS 6.0, PHP 5.2.9 (ISAPI)

$ _SERVER est un variable intégrée PHP. getenv() regarde l'environnement actuel .

dans mon cas, je dois utiliser _SERVE $ R. Merci à tous!

+0

Vérifiez ce qu'il renvoie pour chacune des conditions, ce qui pourrait vous donner un indice. – Piskvor

+0

Déjà ... Les trois cas retournent "". – Sasha

Répondre

1

Essayez $ _SERVER [ 'REMOTE_ADDR'] ou $ _SERVER [ 'HTTP_X_FORWARDED_FOR']

Si vous vous demandez ce qui est défini, vous pouvez vider $ _SERVER quelque part.

+0

$ _SERVER ["REMOTE_ADDR"] fonctionne bien! Mais pourquoi getenv ("REMOTE_ADDR") ne pas ??? – Sasha

+0

Bon post: http://stackoverflow.com/questions/1636644/quelle-est-la- meilleure-conseille-de-mettre-par-la-ip – Sasha

0

La valeur de la variable d'environnement REMOTE_ADDR doit être vide ou non définie. Si vous travaillez sur Linux, vérifiez sa valeur sur le terminal à l'aide de la commande echo $ REMOTE_ADDR. Si elle renvoie null, définit sa valeur avant d'affecter $ ip.

+0

Ce code s'exécute sur W2003EE, IIS 6.0, PHP 5.2.9 (ISAPI). – Sasha

0

Le problème peut avoir quelque chose à voir avec IIS fonctionnant un peu différemment. J'ai eu du succès avec ces deux fonctions du projet CakePHP.

/** 
* Gets remote client IP 
* 
* @return string Client IP address 
* @access public 
*/ 
function getClientIP($safe = true) { 
    if (!$safe && env('HTTP_X_FORWARDED_FOR') != null) { 
     $ipaddr = preg_replace('/(?:,.*)/', '', env('HTTP_X_FORWARDED_FOR')); 
    } else { 
     if (env('HTTP_CLIENT_IP') != null) { 
      $ipaddr = env('HTTP_CLIENT_IP'); 
     } else { 
      $ipaddr = env('REMOTE_ADDR'); 
     } 
    } 

    if (env('HTTP_CLIENTADDRESS') != null) { 
     $tmpipaddr = env('HTTP_CLIENTADDRESS'); 

     if (!empty($tmpipaddr)) { 
      $ipaddr = preg_replace('/(?:,.*)/', '', $tmpipaddr); 
     } 
    } 
    return trim($ipaddr); 
} 

/** 
* Gets an environment variable from available sources, and provides emulation 
* for unsupported or inconsistent environment variables (i.e. DOCUMENT_ROOT on 
* IIS, or SCRIPT_NAME in CGI mode). Also exposes some additional custom 
* environment information. 
* 
* @param string $key Environment variable name. 
* @return string Environment variable setting. 
* @link http://book.cakephp.org/view/701/env 
*/ 
    function env($key) { 
     if ($key == 'HTTPS') { 
      if (isset($_SERVER['HTTPS'])) { 
       return (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off'); 
      } 
      return (strpos(env('SCRIPT_URI'), 'https://') === 0); 
     } 

     if ($key == 'SCRIPT_NAME') { 
      if (env('CGI_MODE') && isset($_ENV['SCRIPT_URL'])) { 
       $key = 'SCRIPT_URL'; 
      } 
     } 

     $val = null; 
     if (isset($_SERVER[$key])) { 
      $val = $_SERVER[$key]; 
     } elseif (isset($_ENV[$key])) { 
      $val = $_ENV[$key]; 
     } elseif (getenv($key) !== false) { 
      $val = getenv($key); 
     } 

     if ($key === 'REMOTE_ADDR' && $val === env('SERVER_ADDR')) { 
      $addr = env('HTTP_PC_REMOTE_ADDR'); 
      if ($addr !== null) { 
       $val = $addr; 
      } 
     } 

     if ($val !== null) { 
      return $val; 
     } 

     switch ($key) { 
      case 'SCRIPT_FILENAME': 
       if (defined('SERVER_IIS') && SERVER_IIS === true) { 
        return str_replace('\\\\', '\\', env('PATH_TRANSLATED')); 
       } 
      break; 
      case 'DOCUMENT_ROOT': 
       $name = env('SCRIPT_NAME'); 
       $filename = env('SCRIPT_FILENAME'); 
       $offset = 0; 
       if (!strpos($name, '.php')) { 
        $offset = 4; 
       } 
       return substr($filename, 0, strlen($filename) - (strlen($name) + $offset)); 
      break; 
      case 'PHP_SELF': 
       return str_replace(env('DOCUMENT_ROOT'), '', env('SCRIPT_FILENAME')); 
      break; 
      case 'CGI_MODE': 
       return (PHP_SAPI === 'cgi'); 
      break; 
      case 'HTTP_BASE': 
       $host = env('HTTP_HOST'); 
       if (substr_count($host, '.') !== 1) { 
        return preg_replace('/^([^.])*/i', null, env('HTTP_HOST')); 
       } 
      return '.' . $host; 
      break; 
     } 
     return null; 
    } 
+0

Merci. Ce travail aussi, mais j'ai besoin d'une source plus petite ... – Sasha