【问题标题】:DjangoRestFramework HTTPS Links With Routers and Viewsets带有路由器和视图集的 DjangoRestFramework HTTPS 链接
【发布时间】:2014-03-09 08:11:16
【问题描述】:

有没有一种简单的方法来修改视图集和路由器的开箱即用链接?

例如在urls.py中:

from rest_framework import viewsets, routers
...
class Activity_TypeViewSet(viewsets.ModelViewSet):
    model = Activity_Type
...
router.register(r'activity_types', Activity_TypeViewSet)
...
url(r'^', include(router.urls)),

这会设置像这样的 url 结构:

{"activity_types": "http://odd.quantdevgroup.com/activity_types/"}

问题归结为建立链接有多容易:

{"activity_types": "**https**://odd.quantdevgroup.com/activity_types/"}

如果我停用 http/ 端口 80 并且只允许 https/ 端口 443,那么我的应用程序需要在无法打开 http 后手动将 https 添加到链接中(因为我禁用了端口 80)。

【问题讨论】:

    标签: django ssl https django-rest-framework


    【解决方案1】:

    DRF reverse 使用request.build_absolute_uri(url) 生成将构建URL "using the server variables available in this request." 的URL,因此如果请求是http,则生成的URL 将是HTTP 和HTTPS 相同。

    如果您的 django 应用程序在反向代理之后运行,那么您需要配置 SECURE_PROXY_SSL_HEADER 设置。

    SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
    

    但是,在设置时你必须非常小心:

    警告

    如果您设置此选项,您可能会在您的网站中打开安全漏洞 不知道你在做什么。如果你没有设置它,当你 应该。说真的。

    在设置之前确保以下所有条件都为真(假设 上例中的值):

    您的 Django 应用程序位于代理后面。您的代理剥离 X-Forwarded-Proto 所有传入请求的标头。换句话说, 如果最终用户在他们的请求中包含该标头,代理将 丢弃它。您的代理设置 X-Forwarded-Proto 标头并将其发送 到 Django,但仅适用于最初通过 HTTPS 传入的请求。如果 其中任何一个都不正确,您应该将此设置设置为 None 并找到另一种确定 HTTPS 的方法,可能是通过自定义 中间件。

    对于 nginx,您可以使用此配置设置 X-Forwarded-Proto 标头:

    location / {
        # ... 
        proxy_set_header X-Forwarded-Proto $scheme;
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-22
    • 2015-05-24
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多