使用nginx作为反向代理将http路由到https

时间:2011-01-12 18:10:02

标签: python django ssl https nginx

我的网站有一个登录页面,我需要使用https。我在apache上使用django运行该站点,其中nginx前端充当反向代理,执行两项操作:

1)提供所有django静态内容 2)配置为支持ssl

ssl的东西都设置好了,似乎工作正常....我可以去两个

http://www.mysite.com/login

https://www.mysite.com/login

没有问题,https要求我验证证书等。

我的问题是我正在尝试设置nginx,以便无法在不是https的登录页面中输入密码。我不能让它重新指导。

有人可以解释一下这是如何运作的

ssl在443上运行,nginx在端口80上转发

感谢

2 个答案:

答案 0 :(得分:1)

这些重定向更适合在您的网络应用中配置,而不是Nginx,因为虽然您可能在Nginx中硬编码重定向,但在Python中设置它们与您的视图直接相关更容易。

当然是我的意见。

djangosnippets上有大量的SSL重定向中间件会将网址重定向到https。

这是一个装饰器,所以你可以在你的视图上做@securehttp://djangosnippets.org/snippets/1999/

我稍微修改一下这个修改后的http://djangosnippets.org/snippets/880/ 我在settings.py文件中将某些url路径设置为SSL。

例如,在我的conf中,我有:SSL_URLS = ( '/cart/', '/checkout/', '/accounts/' )

答案 1 :(得分:1)

如果要在nginx代理级别将网址http://www.mysite.com/login重定向到 https ://www.mysite.com/login,这样可以避免加载任何django机器,更快,更快速。

您可以添加到您的nginx配置

  location /login {
    # redirect to secure page [permanent | redirect]
    rewrite ^/login(.*)  https://www.mysite.com/login permanent;
  }

基本上将任何/ login重定向到其https conterpart。

希望它有所帮助。

更新

确保您收听端口443

server {
   listen yourIP:80;
   server_name yourdomain.com;

   # redirect /login to the https page
   location /login {
     # redirect to secure page [permanent | redirect]
     rewrite ^/login(.*)  https://www.mysite.com/login permanent;
   }
}


#the HTTPS section listening to port 443 
server {
   listen yourIP:443;
   server_name yourdomain.com;

   location / {
     #your proxy code or root setting 
   }
}