通过 Docker 容器和 Nginx 网络服务器在 Laravel 中获取用户的 IP 地址
Getting a user's IP address in Laravel through Docker containers and Nginx webserver
美好的一天,
我的问题是在使用 Laravel 的 $request->ip()
或 $request->getClientIp ()
或 $request->server->get('REMOTE_ADDR')
或 $_SERVER['REMOTE_ADDR']
基本上都和我假设的一样。
到目前为止,问题出现在我的本地测试电脑(没有 Nginx 反向代理)以及我的实时服务器上
我希望我在下面提供了足够的相关信息,如果没有请告诉我 :) 在此先感谢!
所以我的设置如下(简化),两个 Nginx 配置也粘贴在下面:
Server -> Nginx Reverse Proxy -> Docker Containers & Network (db, php, nginx, redis) -> Nginx Webserver <-> PHP-FPM
一些与_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
我在尝试和更改配置等方面花了数小时阅读了多个论坛和解决方案,但 none 似乎有效。
我试过的:
所以我也尝试通过允许所有 protected $proxies = '*';
在 Laravel 的 /Http/Middleware/TrustProxies.php
中设置我的“受信任的代理”
从 >5.5 开始,我也不需要这些额外的 Laravel 包,我相信这是 Laravel (TrustProxies) 的内置功能。
请在下面找到我的 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;
}
我服务器的 Nginx 反向代理配置(如果相关):
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;
}
}
好的,明白了! :D
我使用 Cloudflare 作为代理,我的 DNS 使用 CloudFlare,并且由于速度/缓存改进,我启用了“通过 CloudFlare 代理”选项。
这导致 CloudFlare 将 HTTP_CF_CONNECTING_IP
“注入”到我的 header 中。
为了检索这个 header 值,我在我的代码中使用了 $_SERVER['HTTP_CF_CONNECTING_IP']
。
另一种解决方案是通过使用 _SERVER['HTTP_X_FORWARDED_FOR']
使用 header 中的 HTTP_X_FORWARDED_FOR
值,我相信这在我的情况下只有在完成以下(发布在我的问题中):
- TrustProxies.php
- proxy_set_headerX-Real-IP$remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
我希望这对其他人也有帮助:D
美好的一天,
我的问题是在使用 Laravel 的 $request->ip()
或 $request->getClientIp ()
或 $request->server->get('REMOTE_ADDR')
或 $_SERVER['REMOTE_ADDR']
基本上都和我假设的一样。
到目前为止,问题出现在我的本地测试电脑(没有 Nginx 反向代理)以及我的实时服务器上
我希望我在下面提供了足够的相关信息,如果没有请告诉我 :) 在此先感谢!
所以我的设置如下(简化),两个 Nginx 配置也粘贴在下面:
Server -> Nginx Reverse Proxy -> Docker Containers & Network (db, php, nginx, redis) -> Nginx Webserver <-> PHP-FPM
一些与_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
我在尝试和更改配置等方面花了数小时阅读了多个论坛和解决方案,但 none 似乎有效。
我试过的:
所以我也尝试通过允许所有 protected $proxies = '*';
/Http/Middleware/TrustProxies.php
中设置我的“受信任的代理”
从 >5.5 开始,我也不需要这些额外的 Laravel 包,我相信这是 Laravel (TrustProxies) 的内置功能。
请在下面找到我的 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;
}
我服务器的 Nginx 反向代理配置(如果相关):
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;
}
}
好的,明白了! :D
我使用 Cloudflare 作为代理,我的 DNS 使用 CloudFlare,并且由于速度/缓存改进,我启用了“通过 CloudFlare 代理”选项。 这导致 CloudFlare 将
HTTP_CF_CONNECTING_IP
“注入”到我的 header 中。 为了检索这个 header 值,我在我的代码中使用了$_SERVER['HTTP_CF_CONNECTING_IP']
。另一种解决方案是通过使用
_SERVER['HTTP_X_FORWARDED_FOR']
使用 header 中的HTTP_X_FORWARDED_FOR
值,我相信这在我的情况下只有在完成以下(发布在我的问题中):
- TrustProxies.php
- proxy_set_headerX-Real-IP$remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
我希望这对其他人也有帮助:D