首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过Docker容器和Nginx and服务器获取Laravel中的用户IP地址

通过Docker容器和Nginx and服务器获取Laravel中的用户IP地址
EN

Stack Overflow用户
提问于 2021-02-25 19:30:15
回答 1查看 3.9K关注 0票数 1

日安,

我的问题是,当使用Laravel的$request->getClientIp ()$request->server->get('REMOTE_ADDR')$_SERVER['REMOTE_ADDR']时,我只能获得Docker地址,这基本上都是我假设的。到目前为止,这个问题发生在我的本地测试pc (没有Nginx反向代理)以及我的实时服务器上。

我希望我已经提供了足够的相关信息,如果没有,请告诉我:)谢谢!

因此,我的设置如下(简化),这两个Nginx吐露也贴在下面:

代码语言:javascript
运行
复制
Server -> Nginx Reverse Proxy -> Docker Containers & Network (db, php, nginx, redis) -> Nginx Webserver <-> PHP-FPM

与_SERVER有关的一些结果:

代码语言:javascript
运行
复制
[SERVER_ADDR] => 172.20.0.3 (nginx webserver)
[REMOTE_PORT] => 55378
[REMOTE_ADDR] => 172.20.0.1 (docker network / gateway)
[SERVER_SOFTWARE] => nginx/1.19.6

我已经读了好几个小时的论坛和解决方案,尝试和改变吐露等,但似乎都没有效果。

我尝试过的:

因此,我还试图在Laravel的/Http/Middleware/TrustProxies.php中设置我的“可信代理”,方法是允许all:protected $proxies = '*';

我也不需要这些额外的Laravel软件包,从>5.5开始,我相信这是Laravel (TrustProxies)内置的特性。

请在我的Nginx配置下面找到

代码语言:javascript
运行
复制
server {
    listen 80;
    server_name domain.com;
    return 301 https://www.example.com;
}

server {
    listen 80 default_server;

    index index.html index.htm index.php;

    server_name www.example.com;

    root /var/www/public;

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php-fpm:9013;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME /var/www/example.com/public/$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
    
   # Support Clean (aka Search Engine Friendly) URLs & enable Gzip compression:
    location / {
        proxy_set_header    X-Real-IP            $remote_addr;
        proxy_set_header    X-Forwarded-For      $proxy_add_x_forwarded_for;
        try_files $uri $uri/ /index.php?$query_string;
        gzip_static on;
    }
   # Override the load balancer IP with real IP.
    fastcgi_param REMOTE_ADDR $http_x_real_ip;

    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
}

以及我的服务器的Nginx反向代理配置(如果相关):

代码语言:javascript
运行
复制
server {
    listen 80;
    listen [::]:80;

    server_name     example.com.au www.example.com.au;

    location / {
        proxy_pass      http://localhost:8013;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Host $server_name;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-12 12:32:05

好的,想清楚了!

  1. I使用Cloudflare作为代理,我的DNS与CloudFlare一起使用,由于速度/缓存的改进,我启用了“通过CloudFlare代理”选项。这导致CloudFlare将一个HTTP_CF_CONNECTING_IP“注入”到我的头上。要检索此标头值,我在代码中使用了$_SERVER['HTTP_CF_CONNECTING_IP'] .

  1. 的另一种解决方案是通过使用_SERVER['HTTP_X_FORWARDED_FOR']从标题中使用HTTP_X_FORWARDED_FOR值,在我的情况下,这只会在执行以下操作(在我的问题中发布)之后才能工作:

  • TrustProxies.php
  • proxy_set_header X-Real $remote_addr;proxy_set_header X转发-用于$proxy_add_x_forwarded_for;

我希望这对其他人也有帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66375236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档