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

Django中间件跳转报Unsafe redirect to URL with protocol 'account'错误如何解决

Django自定义中间件跳转触发Unsafe redirect错误的原因与解决方案

错误触发原因

你调用redirect()时直接将带查询参数的路由命名account:login?return_url={return_url}作为入参,违反了Django的跳转参数规则:
Django的redirect()方法会优先判断入参是否为合法的外部URL,当传入的串以xxx:开头且不是http/https/ftp等合法协议时,会将xxx识别为未知协议,触发不安全跳转拦截,因此抛出"Unsafe redirect to URL with protocol 'account'"错误。路由命名的:仅在单独传入路由名给redirect()/reverse()时才会被识别为命名空间分隔符,拼接查询参数后该规则失效。

解决方法

方案1:先解析路由再拼接参数

先通过reverse()方法将命名路由account:login解析为实际路径,再拼接查询参数,同时对跳转路径做URL编码避免特殊字符导致参数截断:

from django.shortcuts import redirect
from django.urls import reverse
from urllib.parse import quote

def auth_middleware(get_response):
    def middleware(request):
        print("Middleware")
        return_url = quote(request.META['PATH_INFO'])
        if not request.session.get('user_id'):
            login_path = reverse('account:login')
            return redirect(f'{login_path}?return_url={return_url}')
        response = get_response(request)
        return response
    return middleware

额外注意

登录接口拿到return_url参数后,要增加本站路径校验,比如判断路径是否以/开头、不属于外部域名,避免恶意构造参数引导用户跳转到钓鱼站点。

内容的提问来源于stack exchange,提问作者Bibek Karna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 08:15:03