获取客户端IP:使用Cloudflare代理结合Nginx和Flask

我的网站是用cloudflare 代理 + ngnix + flask 请问怎么获取客户端ip

要获取客户端IP地址,您需要在NGINX上配置proxy_protocol。proxy_protocol是一种协议,它可以在代理服务器和后端服务器之间传递原始的客户端IP地址信息。

以下是如何启用proxy_protocol:

  1. 在NGINX配置文件中添加以下行来启用proxy_protocol:
listen 80 proxy_protocol;
  1. 在Flask应用程序中添加以下代码来获取客户端IP地址:
from flask import request

@app.before_request
def get_client_ip():
    if 'X-Forwarded-For' in request.headers:
        return request.headers.getlist('X-Forwarded-For')[0]
    else:
        return request.remote_addr

这将检查请求标头中是否存在X-Forwarded-For标头,并从中提取客户端IP地址。如果没有,则返回request.remote_addr。

请注意,如果使用Cloudflare作为代理服务器,还需要在Cloudflare控制面板中启用“真实IP”功能。该功能将在HTTP标头中添加CF-Connecting-IP标头,其中包含客户端IP地址。

希望这可以帮助您获取客户端IP地址!

listen 80 proxy_protocol; 报520错误

如果您使用了Cloudflare代理,那么应该将NGINX配置中的listen端口更改为443,并启用SSL/TLS来保护数据传输。另外,您需要为NGINX启用proxy_protocol以获取客户端IP地址。

以下是如何在Cloudflare代理+NGINX+Flask环境中获取客户端IP地址:

  1. 在NGINX配置文件中添加以下行以启用proxy_protocol和SSL/TLS:
server {
    listen 443 ssl http2 proxy_protocol;
    ssl_certificate /path/to/ssl/certificate;
    ssl_certificate_key /path/to/ssl/key;

    # rest of your config
}

这将启用SSL/TLS并启用proxy_protocol以获取客户端IP地址。

  1. 在Flask应用程序中添加以下代码以获取客户端IP地址:
from flask import request

@app.before_request
def get_client_ip():
    if 'CF-Connecting-IP' in request.headers:
        return request.headers.getlist('CF-Connecting-IP')[0]
    elif 'X-Forwarded-For' in request.headers:
        return request.headers.getlist('X-Forwarded-For')[0]
    else:
        return request.remote_addr

此代码将检查请求标头中是否存在CF-Connecting-IPX-Forwarded-For标头,并从中提取客户端IP地址。如果没有,则返回request.remote_addr

请注意,在Cloudflare代理下,客户端IP地址将作为CF-Connecting-IP标头发送。如果未启用“真实IP”功能,X-Forwarded-For标头将不会发送任何有用的信息。

希望这可以帮助您获取客户端IP地址!

我用的是 Flexible Encrypts traffic between the browser and Cloudflare 之前我listen 80; 是可以正常访问网站的

如果您使用了Cloudflare代理,那么应该将NGINX配置中的listen端口更改为443,并启用SSL/TLS来保护数据传输。另外,您需要为NGINX启用proxy_protocol以获取客户端IP地址。

以下是如何在Cloudflare代理+NGINX+Flask环境中获取客户端IP地址:

  1. 在NGINX配置文件中添加以下行以启用proxy_protocol和SSL/TLS:
server {
    listen 443 ssl http2 proxy_protocol;
    ssl_certificate /path/to/ssl/certificate;
    ssl_certificate_key /path/to/ssl/key;

    # rest of your config
}

这将启用SSL/TLS并启用proxy_protocol以获取客户端IP地址。

  1. 在Flask应用程序中添加以下代码以获取客户端IP地址:
from flask import request

@app.before_request
def get_client_ip():
    if 'CF-Connecting-IP' in request.headers:
        return request.headers.getlist('CF-Connecting-IP')[0]
    elif 'X-Forwarded-For' in request.headers:
        return request.headers.getlist('X-Forwarded-For')[0]
    else:
        return request.remote_addr

此代码将检查请求标头中是否存在CF-Connecting-IPX-Forwarded-For标头,并从中提取客户端IP地址。如果没有,则返回request.remote_addr

请注意,在Cloudflare代理下,客户端IP地址将作为CF-Connecting-IP标头发送。如果未启用“真实IP”功能,X-Forwarded-For标头将不会发送任何有用的信息。

希望这可以帮助您获取客户端IP地址!

我的nginx配置是 server { listen 80; server_name api-shape.dreamix.com;

access_log  /var/log/nginx/api-shape.dreamix.access.log;
error_log /var/log/nginx/api-shape.dreamix.error.log;

add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Headers' 'Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,X-Data-Type,X-Requested-With,X-Data-Type,X-Auth-Token';

if ( $request_method = 'OPTIONS' ) {
                return 200;
}
proxy_connect_timeout 180s;
proxy_send_timeout 180s;
proxy_read_timeout 180s;
location / {
    proxy_pass http://127.0.0.1:3001/;
    proxy_connect_timeout 300s;
    proxy_send_timeout 300s;
    proxy_read_timeout 300s;
    proxy_set_header Host $host;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header X-real-ip $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
}

} 可以https正常访问,但是获取不到客户端ip

如果您使用了Cloudflare代理,那么应该将NGINX配置中的listen端口更改为443,并启用SSL/TLS来保护数据传输。另外,您需要为NGINX启用proxy_protocol以获取客户端IP地址。

以下是如何在Cloudflare代理+NGINX+Flask环境中获取客户端IP地址:

  1. 在NGINX配置文件中添加以下行以启用proxy_protocol和SSL/TLS:
server {
    listen 443 ssl http2 proxy_protocol;
    ssl_certificate /path/to/ssl/certificate;
    ssl_certificate_key /path/to/ssl/key;

    # rest of your config
}

这将启用SSL/TLS并启用proxy_protocol以获取客户端IP地址。

  1. 在Flask应用程序中添加以下代码以获取客户端IP地址:
from flask import request

@app.before_request
def get_client_ip():
    if 'CF-Connecting-IP' in request.headers:
        return request.headers.getlist('CF-Connecting-IP')[0]
    elif 'X-Forwarded-For' in request.headers:
        return request.headers.getlist('X-Forwarded-For')[0]
    else:
        return request.remote_addr

此代码将检查请求标头中是否存在CF-Connecting-IPX-Forwarded-For标头,并从中提取客户端IP地址。如果没有,则返回request.remote_addr

请注意,在Cloudflare代理下,客户端IP地址将作为CF-Connecting-IP标头发送。如果未启用“真实IP”功能,X-Forwarded-For标头将不会发送任何有用的信息。

希望这可以帮助您获取客户端IP地址!

listen 80 http2 proxy_protocol; 这样行吗

是的,您可以使用以下NGINX配置来启用proxy_protocol:

server {
    listen 80 http2 proxy_protocol;
    server_name yourdomain.com;

    # rest of your config
}

这将为NGINX启用代理协议并允许在代理服务器和后端服务器之间传递客户端IP地址。

对于Flask应用程序,您可以使用以下代码来获取客户端IP地址:

from flask import request

@app.before_request
def get_client_ip():
    if 'CF-Connecting-IP' in request.headers:
        return request.headers.getlist('CF-Connecting-IP')[0]
    elif 'X-Forwarded-For' in request.headers:
        return request.headers.getlist('X-Forwarded-For')[0]
    else:
        return request.remote_addr

此代码将检查请求标头中是否存在CF-Connecting-IPX-Forwarded-For标头,并从中提取客户端IP地址。如果没有,则返回request.remote_addr

请注意,在Cloudflare代理下,客户端IP地址将作为CF-Connecting-IP标头发送。如果未启用“真实IP”功能,X-Forwarded-For标头将不会发送任何有用的信息。

希望这可以帮助您获取客户端IP地址!