移动到新服务器后,我遇到了一个奇怪的问题。用于获取邮件的 cron 检查授权 IP,默认情况下是 127.0.0.1

移动后它停止工作,因为未填充 REMOTE_ADDR 变量。它是从浏览器调用的,但不是从 cron 或从带有 php 的控制台内部运行的。我转储了 $_SERVER 变量,这就是 cron/console 的全部内容

(
   [SHELL] => /bin/sh
   [MAILTO] => *removed*
   [USER] => *removed*
   [PATH] => /usr/bin:/bin
   [PWD] => /home/*removed*
   [SHLVL] => 1
   [HOME] => /home/*removed*
   [LOGNAME] => *removed*
   [_] => /usr/local/bin/php
   [PHP_SELF] => /home/*removed*/public_html/support/cron.php
   [SCRIPT_NAME] => /home/*removed*/public_html/support/cron.php
   [SCRIPT_FILENAME] => /home/*removed*/public_html/support/cron.php
   [PATH_TRANSLATED] => /home/*removed*/public_html/support/cron.php
   [DOCUMENT_ROOT] =>
   [REQUEST_TIME] => 1300522141
   [argv] => Array
       (
           [0] => /home/*removed*/public_html/support/cron.php
       )

   [argc] => 1
)

if(!$cron->isValidIp($_SERVER['REMOTE_ADDR'])) {
    echo sprintf("[ERROR]: Your IP %s is not authorized to run scheduled tasks.  Please notify your administrator.",
        $_SERVER['REMOTE_ADDR']
    );

        // [JAS]: Test all our IPs for a wildcard match
        if(is_array($this->valid_ips))
        foreach($this->valid_ips as $mask) {
            if(empty($mask)) continue;
            if(0 == strcmp(substr($ip,0,strlen($mask)),$mask)) {
                return true;
            }

最佳答案

$_SERVER['REMOTE_ADDR'] 变量由于 Apache 而填充,从命令行运行,不会设置此变量,以及许多其他变量。

此外,即使设置了 REMOTE_ADDR,它也始终是运行 cron 的机器的本地 IP,因为您无法远程运行它。

[编辑]

只是为了一致性,这里有一个使用 php_sapi_name 的例子

if(php_sapi_name() === 'cli') {
    // You're running locally from the CLI
} else {
    // You're running remotely, check against list of authorized ip addresses.
}

在您的情况下,您可以将 if 更改为:
if(php_sapi_name() != 'cli' && !$cron->isValidIp($_SERVER['REMOTE_ADDR'])) {
    ....

关于php - REMOTE_ADDR 为空,不包含在 SERVER 数组中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5362690/

10-16 03:41