You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中检测VPN或代理用户并返回对应连接状态提示

问题根源

你当前的代码存在两个核心逻辑错误:

  • 你编写的check_ping函数是在Django服务端本地执行,检测的是服务器自身的网络连通性,和发起请求的用户是否使用VPN/代理没有任何关联
  • check_ping函数在模块加载阶段就已经执行完成,后续所有用户请求返回的都是第一次运行的固定结果,不会随用户变化动态判断
正确实现方案

判断用户是否使用代理/VPN,核心是检测用户发起的请求的特征,最常用的方案是检测HTTP请求头中代理相关的标记字段,示例代码如下:

from django.http import JsonResponse

# 配置你自己的反向代理白名单,如果你用了Nginx等代理部署Django,把代理的IP加进来避免误判
TRUSTED_PROXY_IPS = {"127.0.0.1"}
# 常见代理请求头列表
PROXY_HEADERS = {
    'HTTP_X_FORWARDED_FOR',
    'HTTP_X_REAL_IP',
    'HTTP_VIA',
    'HTTP_X_PROXY_ID',
    'HTTP_FORWARDED',
    'HTTP_CLIENT_IP',
    'HTTP_X_FORWARDED_HOST',
}

def home(request):
    # 先排除自己的反向代理的情况
    user_ip = request.META.get('REMOTE_ADDR', '')
    if user_ip in TRUSTED_PROXY_IPS:
        # 从X-Forwarded-For取真实用户IP,避免把自己的代理当成用户用的代理
        xff = request.META.get('HTTP_X_FORWARDED_FOR', '')
        if xff:
            user_ip = xff.split(',')[0].strip()
    
    # 检测是否存在代理头
    use_proxy = False
    for header in PROXY_HEADERS:
        if header in request.META:
            if user_ip not in TRUSTED_PROXY_IPS:
                use_proxy = True
                break
    
    if use_proxy:
        return JsonResponse({'status': "Network Error: Not Connected"})
    else:
        return JsonResponse({'status': "Network Active: Connected"})
注意事项
  • 该方案可以检测绝大多数透明代理、普通VPN,对于高匿代理、部分专用VPN的检测需要配合IP风险库实现,你可以将公开的VPN/代理IP段导入本地后新增IP校验逻辑即可
  • 如果你没有用反向代理部署Django,可以删除白名单相关的逻辑,简化检测流程

内容的提问来源于stack exchange,提问作者Comfort Chambeshi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 19:54:03