Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 远程地址为空,不包括在服务器阵列中_Php_Apache_Hosting_Cron - Fatal编程技术网

Php 远程地址为空,不包括在服务器阵列中

Php 远程地址为空,不包括在服务器阵列中,php,apache,hosting,cron,Php,Apache,Hosting,Cron,移动到新服务器后,我遇到了一个奇怪的问题。获取邮件的cron检查授权IP,其中一个默认为127.0.0.1 它在移动后停止工作,因为未填充REMOTE_ADDR变量。它是从浏览器调用的,但不是从cron内部运行或使用php从控制台运行时。我转储了$\u服务器变量,这就是它在cron/console中的全部功能 ( [SHELL] => /bin/sh [MAILTO] => *removed* [USER] => *removed* [PATH] =&g

移动到新服务器后,我遇到了一个奇怪的问题。获取邮件的cron检查授权IP,其中一个默认为127.0.0.1

它在移动后停止工作,因为未填充REMOTE_ADDR变量。它是从浏览器调用的,但不是从cron内部运行或使用php从控制台运行时。我转储了$\u服务器变量,这就是它在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;
            }

$\u SERVER['REMOTE\u ADDR']
变量是由于Apache从命令行运行而填充的,因此不会设置此变量以及其他许多变量

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

[编辑]

为了保持一致性,这里有一个使用php_sapi_名称的示例

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'])) {
    ....

当从命令行脚本运行时,
REMOTE\u ADDR
不会被填充,因为它的值是从HTTP头中获得的


是否尝试检查此项以确保脚本未从web浏览器运行?如果是这种情况,您可以将其移动到web根目录上方的目录,并允许cron以这种方式运行它。

这就是目的,cron检查是否:1)它是从浏览器运行的,具有列表中的授权IP;2)它是运行区域设置(例如cronjob),因此127.0.0.1在auth变量列表中。它是一个商业软件的一部分,已经存在多年,并且仍然在运行。这对我来说已经运行了好几年了,就在刚刚安装了一个新的服务器之后,它正在这样做。如果它返回'cli',则您正在本地上运行,否则请检查远程地址以获取允许的ip地址。