您的位置:

最佳方案处理django DisallowedRedirect("Unsafe redirect to URL with protocol '%s'" % parsed.scheme)

  发布时间:2023-03-16 10:16:14
报错的原因这个错误通常是由于Django在防止安全问题,因此禁止了对不安全的URL重定向。例如,假设你正在使用Django的函数来重定向到一个URL,但这个URL使用了不安全的协议。在这种情况下,你可能会得到如下错误这是因为Django不允许对不安全的URL重定向。使用例子是的,下面是一个使用函数检查URL是否安全,然后决定是否使用函数进行重定向的例子这样,你就能够避免错误,并正常重定向到安全的URL。

报错的原因

这个错误通常是由于Django在防止安全问题,因此禁止了对不安全的URL重定向

例如,假设你正在使用Django的HttpResponseRedirect函数来重定向到一个URL,但这个URL使用了不安全的协议(例如ftp或telnet)。在这种情况下,你可能会得到如下错误:


DisallowedRedirect("Unsafe redirect to URL with protocol '%s'" % parsed.scheme)

这是因为Django不允许对不安全的URL重定向。为了解决这个问题,你需要使用安全的协议(例如http或https)来重定向。例如,你可以使用如下代码来重定向到安全的URL:


from django.http import HttpResponseRedirect

def my_view(request):
    # Redirect to a safe URL
    return HttpResponseRedirect('http://www.example.com/')

在这种情况下,你应该能够避免DisallowedRedirect("Unsafe redirect to URL with protocol '%s'" % parsed.scheme)错误,并正常重定向到安全的URL。

如何解决

解决DisallowedRedirect("Unsafe redirect to URL with protocol '%s'" % parsed.scheme)错误的方法是使用安全的协议(例如http或https)来重定向到URL。例如,你可以使用如下代码来重定向到安全的URL:


from django.http import HttpResponseRedirect

def my_view(request):
    # Redirect to a safe URL
    return HttpResponseRedirect('http://www.example.com/')

这样,你就能够避免DisallowedRedirect("Unsafe redirect to URL with protocol '%s'" % parsed.scheme)错误,并正常重定向到安全的URL。

如果你想要在Django中使用不安全的协议来重定向到URL,你可以使用以下方法之一:

- 在你的Django设置中设置允许的重定向协议列表(例如ALLOWED_REDIRECT_PROTOCOLS),使得它包含你想要使用的协议。

- 使用django.utils.http.is_safe_url函数,手动检查URL是否安全,然后决定是否使用HttpResponseRedirect函数进行重定向。

例如,你可以使用如下代码手动检查URL是否安全,然后决定是否使用HttpResponseRedirect函数进行重定向


from django.http import HttpResponseRedirect
from django.utils.http import is_safe_url

def my_view(request):
    # Check if the URL is safe
    url = 'ftp://www.example.com/'
    if is_safe_url(url, host=request.get_host()):
        # The URL is safe, so redirect to it
        return HttpResponseRedirect(url)
    else:
        # The URL is not safe, so don't redirect
        return HttpResponse('The URL is not safe')

如果你想在Django中使用不安全的协议来重定向到URL,你还可以使用以下方法之一:

- 在你的Django设置中设置允许的重定向协议列表(例如ALLOWED_REDIRECT_PROTOCOLS),使得它包含你想要使用的协议。

- 使用django.utils.http.is_safe_url函数,手动检查URL是否安全,然后决定是否使用HttpResponseRedirect函数进行重定向。

例如,你可以在Django设置中设置允许的重定向协议列表,使得它包含你想要使用的协议:


# settings.py

ALLOWED_REDIRECT_PROTOCOLS = ['http', 'https', 'ftp']

然后,你就可以使用HttpResponseRedirect函数来重定向到使用不安全的协议(例如ftp)的URL,而不会收到DisallowedRedirect("Unsafe redirect to URL with protocol '%s'" % parsed.scheme)错误。

但是,请注意,使用不安全的协议来重定向到URL可能会导致安全问题,因此应该尽量避免使用不安全的协议。

使用例子

是的,下面是一个使用django.utils.http.is_safe_url函数检查URL是否安全,然后决定是否使用HttpResponseRedirect函数进行重定向的例子:


from django.http import HttpResponseRedirect
from django.utils.http import is_safe_url

def my_view(request):
    # Check if the URL is safe
    url = 'ftp://www.example.com/'
    if is_safe_url(url, host=request.get_host()):
        # The URL is safe, so redirect to it
        return HttpResponseRedirect(url)
    else:
        # The URL is not safe, so don't redirect
        return HttpResponse('The URL is not safe')

这样,你就能够避免DisallowedRedirect("Unsafe redirect to URL with protocol '%s'" % parsed.scheme)错误,并正常重定向到安全的URL。