【问题标题】:Django + uwsgi + nginx + SSLDjango + uwsgi + nginx + SSL
【发布时间】:2011-10-10 15:04:35
【问题描述】:

我在 DotCloud 上使用 Django,它在 uwsgi + nginx 之上使用 Django。我正在尝试将所有 http 流量重定向到导致重定向循环的 https。我正在使用以下http配置

if ($http_x_forwarded_port != 443) { rewrite ^ https://$http_host/; }

似乎Django不明白它是在https上运行并且没有保留标头。它将https://url.com/ 重定向到http://url.com/accounts/login/,这会一次又一次地重定向,从而导致重定向循环。我不是 nginx 方面的专家,也不太了解它。我做错了什么?

简而言之,我如何在运行于 uswsgi 和 nginx 之上的 django 中运行重定向 http 到 https。

【问题讨论】:

标签: django uwsgi dotcloud


【解决方案1】:
server {
  listen  80;
  server_name  yourhttphost;
  rewrite ^ https://yourhttpshost$request_uri? permanent; #301 redirect
}
server {
  listen 443;
  server_name  yourhttpshost;
  ........
  the rest
  ........
}

在 nginx 配置中使用“if”是一个非常糟糕的主意!

【讨论】:

  • 这是正确的答案,因为“if”语句在 nginx 配置中通常不是一个好主意。
  • 是的,我知道'if'呵呵
【解决方案2】:

我需要更多的东西让 Django 意识到它应该使用 https。

在 settings.py 我添加了 SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

并且在 nginx 配置中

location / {
    proxy_set_header X-Forwarded-Proto https;
    include uwsgi_params;
    uwsgi_param UWSGI_SCHEME https;
    uwsgi_pass_header X_FORWARDED_PROTO;
    uwsgi_pass unix:///path/to/socket;
}

【讨论】:

  • 为了后代,此答案仅在端口 443 开放时有效(即防火墙阻止端口 80 上的请求)
  • uwsgi_pass_header 允许将标头从服务器传递到客户端,因此这可能不是您需要的。正确的重定向怎么样, UWSGI_SCHEME 参数在我的情况下没有任何自定义标头就可以了。是否真的需要 SECURE_PROXY_SSL_HEADER 设置?
【解决方案3】:
if ( $scheme = "http" ) {
     rewrite ^/(.*)$   https://$host/ permanent;
}

【讨论】:

  • 在 Nginx 中为每个请求处理一个“if”是非常无效的。最好创建一个单独的 :80 服务器并将每个请求重定向到它。
猜你喜欢
  • 1970-01-01
  • 2015-07-01
  • 2014-05-31
  • 2011-11-25
  • 2017-04-12
  • 2015-11-08
  • 2014-08-09
  • 2019-03-03
  • 2014-12-17
相关资源
最近更新 更多