Реальный клиент nginx ip не работает

У меня установлены nginx, php7 и http_realip_module.

У меня есть 1 сервер, который обслуживает 2 сайта.

Конфигурация nginx для сайта 1:

server {
    ...
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        fastcgi_read_timeout 300;

        proxy_set_header REMOTE_ADDR $http_x_real_ip;
        proxy_set_header X-Forwarded-For $http_x_real_ip;
    }
}

это заполняет IP-адрес клиента, когда я дам дамп $_SERVER['REMOTE_ADDR"].

сайт 1 подключается к сайту 2, используя curl, как просто API.

$ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);
curl_setopt($ch, CURLOPT_URL, $serverUrl);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    "REMOTE_ADDR: ".$_SERVER['REMOTE_ADDR'], 
    "HTTP_X_FORWARDED_FOR: ".$_SERVER['REMOTE_ADDR'],
));
$result = curl_exec($ch);

Конфигурация nginx для сайта 2:

server {
    ...
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        fastcgi_read_timeout 300;

        set_real_ip_from 127.0.0.1;
        real_ip_header    X-Forwarded-For;
        real_ip_recursive on;

    }
}

Я вижу, что сценарий на сайте 2 вызывается, но когда я проверяю переменную $_SERVER['REMOTE_ADDR'] в PHP, он обнаруживает IP-адрес сервера, а не IP-адрес клиента. здесь правильно настроены nginx?

как я могу заставить это работать правильно?

1 ответ

Решение

После некоторого обсуждения и некоторых проб / ошибок ниже, мы обнаружили, что лучшим решением было бы просто пропустить его через $_GET параметр.

Попробуйте использовать полностью настраиваемый заголовок:

curl_setopt($ch, CURLOPT_URL, $serverUrl . '?client_ip=' . $_SERVER['REMOTE_ADDR']);

Поскольку вы просто перенаправляете эту переменную, нет необходимости пытаться адаптировать ее к заголовку.

После дальнейшего обсуждения я обнаружил, что nginx по умолчанию обрезает заголовки подчеркиванием. Простое изменение подчеркивания на тире позволяет конечному хосту получить заголовки:

curl_setopt($ch, CURLOPT_HTTPHEADER, array( 
    "X-CLIENT-REMOTE-IP: " . $_SERVER['REMOTE_ADDR']
));
Другие вопросы по тегам