Yang Yubo's Life @ Refactoring

HTTPS django-cpserver 和 Nginx 反向代理

written on Saturday, August 29, 2009

使用 django-cpserver + Nginx + HTTPS 协议跑 Django 应用, 一般的页面浏览均正常, 但是对于登录 admin 控制台或是保存编辑操作, Django 重定向机制会跳转到 HTTP 协议, 而不是预期的 HTTPS.

内部 blog 也是用 django-cpserver 跑, HTTPS 请求先经由 Webfaction 主 Nginx 反向代理服务器过滤.

由于 Nginx 接管了 HTTPS 加密/解密, 并把用户请求作为普通 HTTP 请求进行转发, 所以 django-cpserver 和 Django 对 HTTPS 一无所知, request.is_secure() 将总是返回 False.

修正方法

用一个简单的 WSGI Middleware 修改请求对象:

class SSLMiddleware(object):
    """
    Middleware that applies some fixes for people using
    Nginx manage HTTPS and forward requests as HTTP to
    backend server.
    """
    def process_request(self, request):
        # use HTTPS forever
        request.is_secure = lambda: True == True

将以上代码保存成 .py 文件, 并追加到 Django settings.py 文件 MIDDLEWARE_CLASSES 元组中, 重启后台服务器生效.

This entry was tagged Django, HTTPS and Nginx

blog comments powered by Disqus