【问题标题】:How to stop the client IP address getting lost in a Cloudflare/Docker/NGINX/LAMP site?如何阻止客户端 IP 地址在 Cloudflare/Docker/NGINX/LAMP 站点中丢失?
【发布时间】:2016-12-10 22:19:06
【问题描述】:

问题是我的以下站点结构中没有设置 PHP 字段 $_SERVER['HTTP_CLIENT_IP'],我应该如何更正?

Docker 桥接网络(位于 cloudflare 后面的主机上)名为“back”的静态 IP 容器:

  1. NGINX 在容器 (172.24.02) 中运行
  2. 容器中的 Apache + PHP (172.24.0.3)

nginx.conf:

location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;
    proxy_pass http://172.24.0.3;
}

test.php

<?php

echo('HTTP_CLIENT_IP: '.$_SERVER['HTTP_CLIENT_IP']);
echo('<br>HTTP_X_FORWARDE‌​D_FOR'.$_SERVER['HTTP_X_FORWARDE‌​D_FOR']);
echo('<br>REMOTE_ADDR'.$_SERVER['REMOTE_ADDR']);
echo('<br>HTTP_X_FORWARDED'.$_SERVER['HTTP_X_FORWARDED']);
echo('<br>HTTP_FORWARDED'.$_SERVER['HTTP_FORWARDED']);
echo('<br>HTTP_FORWARDED_FOR'.$_SERVER['HTTP_FORWARDED_FOR']);

?>

运行上述结果:

HTTP_CLIENT_IP: 
HTTP_X_FORWARDE‌​D_FOR: 
REMOTE_ADDR: 172.24.0.2
HTTP_X_FORWARDED: 
HTTP_FORWARDED: 
HTTP_FORWARDED_FOR:

【问题讨论】:

  • 如何将 Nginx 和 Apache 配置为协同工作?
  • HTTP_CLIENT_IP 不是标准标头,REMOTE_ADDR 是 IP 的标准,但在代理情况下,您需要设置标头。为什么不打印出所有标题print_r($_SERVER),而不是尝试打印不一定与正在定义的标题对齐的标题。
  • @Devon Apache 在一个容器中的 80 端口上运行,nginx 只是将请求转发给它并使用上述配置传递标头。我将尝试您的建议重新打印出整个变量

标签: php nginx docker cloudflare


【解决方案1】:

感谢@Devon 提出打印 $_SERVER 变量的建议,结果发现以下字段中包含客户端 IP:

$_SERVER['HTTP_CF_CONNECTING_IP']
$_SERVER['HTTP_X_FORWARDED_FOR']

第一个给client IP,第二个给client IP, cloudflare IP

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    相关资源
    最近更新 更多