【问题标题】:build_absolute_uri with HTTPS behind reverse proxybuild_absolute_uri 在反向代理后面使用 HTTPS
【发布时间】:2020-09-14 17:51:53
【问题描述】:

我在反向代理后面为我的 django 应用程序提供服务

互联网 -> Nginx -> Gunicorn 套接字 -> Django 应用程序

在 nginx 配置中:

upstream my_server {
  server unix:/webapps/my_app/run/gunicorn.sock fail_timeout=0;
}

SSL 是在 nginx 级别使用 certbot 设置的。

views.py 中的request.build_absolute_uri 生成 http 链接。如何强制它生成 https 链接?

【问题讨论】:

    标签: django nginx gunicorn


    【解决方案1】:

    默认情况下,Django 忽略所有 X-Forwarded 标头,基于 Django docs.

    通过设置USE_X_FORWARDED_HOST = True 和设置SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') 强制读取X-Forwarded-Host 标头。所以在settings.py:

    USE_X_FORWARDED_HOST = True
    SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
    

    【讨论】:

      【解决方案2】:

      我在 apache2 后面使用 django,所以我的解决方案是把它放在 apache2 上

      <VirtualHost *:443>
        RequestHeader set X-Forwarded-Proto 'https' env=HTTPS
      

      添加headers mod后:

      a2enmod headers
      

      这在 django setting.py 上:

      USE_X_FORWARDED_HOST = True
      SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
      

      我所有的 build_absolute_uri 都是从 https 开始的

      【讨论】:

        【解决方案3】:

        这里的django文档中有一个注释https://docs.djangoproject.com/en/3.0/ref/request-response/#django.http.HttpRequest.build_absolute_uri

        Mixing HTTP and HTTPS on the same site is discouraged, therefore build_absolute_uri() will always generate an absolute URI with the same scheme the current request has. If you need to redirect users to HTTPS, it’s best to let your Web server redirect all HTTP traffic to HTTPS.

        【讨论】:

        • 我的网络服务器已经重定向。这并没有解决 build_absolute_uri 生成 HTTP 链接的问题
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-16
        • 2021-02-01
        • 1970-01-01
        • 2020-05-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多