Nginx ersetzt REMOTE_ADDR durch X-Forwarded-For

Lesezeit: 2 Minuten

Ich bin ziemlich neu bei Nginx und es scheint alles so verwirrend zu sein. Ich habe meinen Server perfekt eingerichtet, aber das Problem ist, dass mein Server mit einem HTTP-Proxy geschützt ist; Anstatt die IPs der echten Benutzer zu protokollieren, wird die IP des Proxyservers protokolliert.

Was ich versucht habe, war das Einstellen $_SERVER['REMOTE_ADDR']; Zu $_SERVER['X-Forwarded-For']; aber ich erhalte einen undefinierten Indexfehler, also muss ich wohl definieren X-Forwarded-For in Nginx? Aber ich weiß nicht, wie das geht, ich habe ein einfaches Setup, es ist nur Nginx mit PHP. Nicht mehr, nicht weniger.

Ich habe das ganze Internet durchsucht, kann aber keine Informationen finden, die freundlich zu verstehen sind.

Ich habe Zugriff auf den Quellcode, falls das etwas hilft. Ich habe viele Lösungen ausprobiert, aber ohne Erfolg.

Der richtige Weg, dies zu tun, ist die Einstellung von real_ip_header Konfiguration in nginx.

Beispiel mit vertrauenswürdiger HTTP-Proxy-IP:

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

Auf diese Weise wird der $_SERVER[‘REMOTE_ADDR’] wird in PHP fastcgi korrekt ausgefüllt.

Dokumentationslink – nginx.org

  • Ich habe überall nach einer Lösung gesucht, die tatsächlich funktioniert. Vielen Dank!!!! EINDRUCKSVOLL! Fügen Sie es einfach in Ihren.. server { location ~ \.php$ { block section ein. und es funktioniert alles!!!! GUT GEMACHT!

    – CGrau

    8. Juli 2015 um 15:50 Uhr


  • verwenden 0.0.0.0/0 Und ::/0 um alle IP-Adressen abzugleichen

    – Prawdomil

    3. Juli 2018 um 15:58 Uhr

Fredriks Benutzeravatar
Fredrik

$http_x_forwared_for kann mehrere IP-Adressen enthalten, wobei die erste die Client-IP sein sollte. REMOTE_ADDR sollte nur die Client-IP sein.

Durch die Verwendung von Regex in Ihrem nginx.confkönnen Sie einstellen REMOTE_ADDR auf die erste ip von $http_x_forwarded_for so:

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

  • Da es nicht möglich ist, zu verwenden set Richtlinie ein http blockieren, Es könnte besser sein, zu verwenden map stattdessen.

    – Antonbormotow

    5. Dezember 2018 um 10:47 Uhr

  • Dies funktioniert nicht wie es ist und unterstützt keine IPv6-Adressen!

    – Lasse Poulsen

    22. Juli 2020 um 9:01 Uhr

  • @LassePoulsen ja, diese Regex funktioniert nur für ipv4, aber ich bin mir sicher, dass eine Änderung für ipv6 möglich wäre. Was funktioniert noch nicht “wie es ist”?

    – Fredrik

    22. Juli 2020 um 11:19 Uhr


Benutzeravatar von Antonbormotov
Antonbormotov

Eine Ergänzung zu @fredriks Antwort.
Vielleicht besser einstellen $real_ip verwenden map Richtlinie:

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

Dann einstellen fastcgi_param REMOTE_ADDR In fastcgi_params Datei oder ein Standortblock:

fastcgi_param  REMOTE_ADDR          $real_ip;

edit: Tippfehler im Variablennamen behoben

Ich habe mein eigenes Problem gelöst, da PHP durch FastCGI gefiltert wird, habe ich einfach einen schnellen CGI-Parameter hinzugefügt, der gesetzt ist REMOTE_ADDR zur Variable http_x_forwarded_foralso sowas ähnliches:

fastcgi_param REMOTE_ADDR $http_x_forwarded_for;

1444680cookie-checkNginx ersetzt REMOTE_ADDR durch X-Forwarded-For

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy