【问题标题】:getenv("HTTP_XXX) return nothinggetenv("HTTP_XXX) 不返回任何内容
【发布时间】:2009-10-30 13:33:23
【问题描述】:

为什么这段代码返回“”:

$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");
}

环境: W2003EE、IIS 6.0、PHP 5.2.9 (ISAPI)

$_SERVER 是一个内置的 PHP 变量。 getenv() 查看当前 环境。

就我而言,我需要使用 $_SERVER。谢谢大家!

【问题讨论】:

  • 检查每个条件的返回值,这可能会给你一个线索。
  • 已经...所有三种情况都返回“”。

标签: php


【解决方案1】:

试试 $_SERVER['REMOTE_ADDR'] 或 $_SERVER['HTTP_X_FORWARDED_FOR']

如果您想知道设置了什么,您可以将 $_SERVER 转储到某个地方。

【讨论】:

【解决方案2】:

环境变量REMOTE_ADDR 的值必须为空或未设置。如果在 linux 上工作,请通过命令 echo $REMOTE_ADDR 在终端上检查其值。如果返回 null,则在分配 $ip 之前设置其值。

【讨论】:

    【解决方案3】:

    此问题可能与 IIS 的工作方式略有不同有关。我在 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;
        }
    

    【讨论】:

      猜你喜欢
      • 2020-04-27
      • 2019-04-06
      • 2012-02-15
      • 2020-09-07
      • 2021-11-22
      • 2015-11-06
      • 2013-11-14
      • 2014-03-23
      • 2012-08-25
      相关资源
      最近更新 更多