2016-07-31 2 views
2

У меня установлены nginx, php7 и http_realip_module.nginx real client ip не работает

У меня 1 сервер, обслуживающий 2 веб-сайта.

сайт 1 Nginx конфигурации:

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 с помощью завиток как просто апи..

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

сайт 2 Nginx конфигурации:

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 здесь?

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

ответ

2

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

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

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

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

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

curl_setopt($ch, CURLOPT_HTTPHEADER, array( 
    "X-CLIENT-REMOTE-IP: " . $_SERVER['REMOTE_ADDR'] 
)); 
+0

, похоже, не сработало? как я смотрю дальше на curl, он не смотрит, чтобы посылать заголовки на страницу site2 php. Переменная $ _SERVER содержит переменную X_CLIENT_REMOTE_IP? – Ourx

+0

Вы пробовали просто сделать 'print_r ($ _ SERVER);'? – FrankerZ

+0

typo: переменная $ _SERVER -doesnt- содержит переменную X_CLIENT_REMOTE_IP – Ourx

Смежные вопросы