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

在Django Rest Framework中如何获取用户请求来源URL?

在Django Rest Framework中安全获取请求来源URL

前端主动传递URL的方式确实存在被篡改的风险,后端可以通过读取请求头字段来获取来源信息,以下是具体实现方案:

1. 读取HTTP_REFERER请求头

这个请求头会记录发起当前请求的页面完整URL,直接通过Django的request对象即可获取:

from rest_framework.views import APIView
from rest_framework.response import Response

class PostsAPIView(APIView):
    def get(self, request):
        # 获取来源URL,为空时返回None
        referer_url = request.META.get('HTTP_REFERER')
        # 后续业务逻辑
        return Response({'source_url': referer_url})

注意:HTTP_REFERER可能为空(比如用户直接访问API地址、浏览器禁用该字段或代理拦截),所以必须做空值判断。

2. 跨域场景用HTTP_ORIGIN请求头

如果是跨域请求,浏览器会发送Origin头,它仅包含协议、域名和端口(不包含具体路径),适合验证来源域名:

class PostsAPIView(APIView):
    def get(self, request):
        origin_url = request.META.get('HTTP_ORIGIN')
        return Response({'origin_url': origin_url})

安全性增强方案

请求头仍存在被伪造的可能,若需严格验证来源合法性,可结合域名白名单:

# 提前配置允许的前端域名列表
ALLOWED_ORIGINS = ['https://your-official-frontend.com', 'http://localhost:3000']

class PostsAPIView(APIView):
    def get(self, request):
        origin = request.META.get('HTTP_ORIGIN') or request.META.get('HTTP_REFERER')
        # 提取域名部分(适配Referer的完整URL格式)
        if origin:
            from urllib.parse import urlparse
            parsed_origin = urlparse(origin).netloc
            allowed_netlocs = [urlparse(allowed).netloc for allowed in ALLOWED_ORIGINS]
            if parsed_origin not in allowed_netlocs:
                return Response({'error': '非法来源'}, status=403)
        # 合法来源,执行后续逻辑
        return Response({'source_info': origin})

内容的提问来源于stack exchange,提问作者Yusuf Mayowa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 08:55:00