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