Bonne journée,

Mon problème est que j'obtiens UNIQUEMENT l'adresse IP de mon réseau Docker lorsque j'utilise $request->ip() ou $request->getClientIp () ou $request->server->get('REMOTE_ADDR') ou $_SERVER['REMOTE_ADDR'] de Laravel, ce qui est essentiellement le cas le même je suppose. Jusqu'à présent, le problème se produit sur mon ordinateur de test local (sans Nginx Reverse Proxy) ainsi que sur mes serveurs en direct

J'espère avoir fourni suffisamment d'informations pertinentes ci-dessous, sinon merci de me le faire savoir :) Merci d'avance!

Donc, ma configuration est la suivante (simplifiée), les deux configurations Nginx sont également collées ci-dessous:

Server -> Nginx Reverse Proxy -> Docker Containers & Network (db, php, nginx, redis) -> Nginx Webserver <-> PHP-FPM

Quelques résultats liés à _SERVER:

[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

J'ai lu plusieurs forums et solutions pendant des heures et des heures en essayant et en changeant les configurations, etc. mais rien de tout cela ne semble fonctionner.

Ce que j'ai essayé:

J'ai donc également essayé de définir mon "proxy de confiance" dans /Http/Middleware/TrustProxies.php de Laravel en autorisant tout: protected $proxies = '*';

Je n'ai pas non plus besoin de ces packages Laravel supplémentaires à partir de> 5.5 Je crois que c'est une fonctionnalité intégrée de Laravel (TrustProxies).

Veuillez trouver ci-dessous ma configuration de serveur Web Nginx :

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;
}

Et la configuration du proxy inverse Nginx de mon serveur (le cas échéant):

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;
    }
}
0
Ray 25 févr. 2021 à 22:30

1 réponse

Meilleure réponse

Ok compris! :RÉ

  1. J'utilisais Cloudflare comme proxy, mon DNS est avec CloudFlare et j'ai activé l'option "Proxy through CloudFlare" en raison des améliorations de vitesse / mise en cache. Cela a abouti à CloudFlare "injectant" un HTTP_CF_CONNECTING_IP dans mon en-tête. Pour récupérer cette valeur d'en-tête, j'ai utilisé $_SERVER['HTTP_CF_CONNECTING_IP'] dans mon code.

  2. Une autre solution consistait à utiliser la valeur HTTP_X_FORWARDED_FOR de l'en-tête en utilisant _SERVER['HTTP_X_FORWARDED_FOR'], je crois que cela ne fonctionnerait, dans ma situation, qu'après avoir effectué les opérations suivantes (postées dans ma question):

  • TrustProxies.php
  • proxy_set_header X-Real-IP $ remote_addr; proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for;

J'espère que cela aide aussi les autres: D

0
Ray 12 mars 2021 à 12:32