【问题标题】:How to use Cloudflare's free SSL to force https on my Django application on Apache+mod_wsgi stack?如何使用 Cloudflare 的免费 SSL 在 Apache+mod_wsgi 堆栈上的 Django 应用程序上强制 https?
【发布时间】:2015-07-24 10:40:15
【问题描述】:

我想在 Apache + mod_wsgi 堆栈上运行的 Django 应用程序中使用 Cloudflare 提供的免费 SSL (DNS) 服务。我可以找到 Nginx + uWSGI 堆栈的设置示例,但目前还没有 Apache + mod_wsgi 堆栈的设置示例。我在这里https://stackoverflow.com/a/27650503/2051292 关注这个答案。但我无法将解决方法从 Nginx 配置转换为 Apache/mod_wsgi。我面临一些问题,

  • 即使我使用 https 访问网页,点击任何内部链接或提交登录/注册表单也只能访问 http 页面。 (我实际上希望所有链接都转到 https 页面

  • 在网页表单(登录、注册)上,我收到 CSRF Failed 403 Access Forbidden 错误。我在 https 页面登录,但在验证后重定向到带有 CSRF 错误的 http 页面。

  • 有时调整配置会导致重定向循环。

想知道在 Apache + mod_wsgi 堆栈中使用 cloudflare free SSL 的工作配置以及设置的 Django 设置

编辑:如果您不知道,这就是 Cloudflare 的免费 SSL 的工作原理。

我没有 SSL 证书,我正在尝试通过 Flexible SSL 来使用免费的 SSL。 用户到 Cloudflare DNS 的连接将是 https,Cloudflare 和我的服务器之间的连接将是 http

注意:目前我使用任何像 django-sslify 这样的中间件。但是使用它会以任何其他方式提供帮助。我也可以。

【问题讨论】:

  • 您是否尝试过使用 PageRules 通过 CloudFlare 强制 https://? PageRules 中有一个始终使用 https:// 选项。 PageRules相关信息:support.cloudflare.com/hc/en-us/articles/…
  • 是的,使用 PageRules 强制“https”会导致无限重定向循环,或者如果从 Django 中移除强制,则会导致“CSRF 令牌失败”,如我上面指定的那样。在 NginX 中,我需要传递这三个 HTTP 标头以避免这些错误。 proxy_set_header X-Scheme $scheme; proxy_set_header X-Forwarded-Protocol $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; 但我无法做到这一点,因为我不确定如何在 Apache 中做到这一点。
  • 好的,您是直接在您的服务器上进行重定向然后还使用 PageRules 吗?我可以看到这将如何导致问题。

标签: django apache ssl mod-wsgi cloudflare


【解决方案1】:

虽然我不知道使用 Cloudflare 的具体细节,但一旦您拥有适当的证书并弄清楚另一个答案中提到的代理设置,它应该是相同的 Apache 配置。这是我在 CentOS 下使用 mod_wsgi 和 mod_ssl 托管 Django 的示例 Apache 配置。在这种配置下,我们甚至不监听 80 端口。这假设您的网站托管在 https://example.com/mysite,并且它部署到用户 mysiteuser 下的 /var/www/html/mysite,并使用名为 mysitevenv 的 virtualenv:

LoadModule wsgi_module modules/mod_wsgi.so
LoadModule ssl_module modules/mod_ssl.so

WSGISocketPrefix /var/run/wsgi

NameVirtualHost *:443
Listen 443
<VirtualHost *:443>

  ServerName example.com
  ErrorLog /home/mysiteuser/apache_errors.log

  WSGIDaemonProcess mysite-https python-home=/home/mysiteuser/.virtualenvs/mysitevenv
  WSGIScriptAlias /mysite /var/www/html/mysite/mysite/wsgi.py process-group=mysite-https application-group=mysite-https
  WSGIProcessGroup so-https
  Alias /mysite/static/ /var/www/html/mysite/static/

  SSLENGINE on 

  SSLCertificateFile /etc/pki/tls/certs/localhost.crt
  SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
  SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
  SSLProtocol all -SSLv2
</VirtualHost>

【讨论】:

  • 只有在我拥有 SSL 证书的情况下,您的答案才会起作用。我正在尝试利用 CloudFlare 提供的免费 DNS 级 SSL 功能。请检查问题,刚刚添加了 CloudFlare DNS 的工作原理。
猜你喜欢
  • 2014-12-13
  • 2016-04-20
  • 2015-12-25
  • 2016-04-24
  • 2015-09-17
  • 1970-01-01
  • 2012-12-20
  • 2019-05-16
  • 2018-12-29
相关资源
最近更新 更多