web-dev-qa-db-fra.com

Nginx remplace REMOTE_ADDR avec X-Forwarded-For

Je suis assez nouveau chez Nginx et cela semble tellement déroutant. J'ai parfaitement configuré mon serveur, mais le problème est que mon serveur est protégé par un proxy HTTP; au lieu de consigner les adresses IP des utilisateurs réels, il enregistre l'adresse IP du serveur proxy.

Ce que j’ai essayé de faire, c’est de régler $_SERVER['REMOTE_ADDR']; sur $_SERVER['X-Forwarded-For'];, mais j’obtiens une erreur d’index non définie. Je suppose donc que je dois définir X-Forwarded-For dans Nginx? Mais je ne sais pas comment faire, j'ai une configuration simple, c'est juste Nginx avec PHP. Ni plus ni moins.

J'ai effectué des recherches sur le Web, mais je ne trouve pas d'informations faciles à comprendre. 

J'ai accès au code source, si cela peut aider un peu. J'ai essayé beaucoup de solutions, mais en vain. 

16
Reverb

Pour ce faire, définissez la configuration real_ip_header dans nginx.

Exemple avec une adresse IP de proxy HTTP de confiance:

set_real_ip_from 127.0.0.1/32;
real_ip_header X-Forwarded-For;

De cette façon, le $ _SERVER ['REMOTE_ADDR'] sera correctement rempli dans PHP fastcgi.

Lien vers la documentation - nginx.org

13
Razvan Grigore

$http_x_forwared_for peut contenir plusieurs adresses IP, la première étant l'adresse IP du client. REMOTE_ADDR ne devrait être que l'ip du client.

Donc, en utilisant regex dans votre nginx.conf, vous pouvez définir REMOTE_ADDR sur la première adresse IP de $http_x_forwarded_for comme suit:

  set $realip $remote_addr;
  if ($http_x_forwarded_for ~ "^(\d+\.\d+\.\d+\.\d+)") {
    set $realip $1;
  }
  fastcgi_param REMOTE_ADDR $realip;
8
fredrik

Un ajout à la réponse de @ fredrik.
Il serait peut-être préférable de définir $realip en utilisant la directive map:

map $http_x_forwarded_for $realip {
        ~^(\d+\.\d+\.\d+\.\d+) $1;
        default $remote_addr;
    }

Ensuite, définissez fastcgi_param REMOTE_ADDR dans le fichier fastcgi_params ou un bloc d’emplacement:

fastcgi_param  REMOTE_ADDR          $real_ip;
1
antonbormotov

J'ai résolu mon propre problème, puisque PHP est filtré via FastCGI, j'ai simplement ajouté un paramètre CGI rapide qui définit REMOTE_ADDR dans la variable http_x_forwarded_for, ce qui donne un résultat similaire:

fastcgi_param REMOTE_ADDR $http_x_forwarded_for;
0
Reverb