使用nginx作为反向代理将http路由到https
我有一个网站,里面有一个登录页面,我需要让这个页面使用https。这个网站是用django搭建的,运行在apache上,前面有一个nginx作为反向代理,主要做两件事:
1) 提供所有django的静态内容
2) 配置支持ssl
ssl的设置都已经完成,看起来也正常工作……也就是说,我可以顺利访问这两个链接:
和
没有任何问题,https也会让我验证证书等等。
我遇到的问题是,我想设置nginx,让用户在非https的登录页面上无法输入密码。我一直无法实现这个重定向。
有没有人能解释一下这是怎么回事?
ssl运行在443端口,而nginx在80端口转发。
谢谢!
2 个回答
关于将网址 http://www.mysite.com/login 重定向到 https://www.mysite.com/login 的问题,可以在 nginx 代理层面进行处理,这样就不需要加载任何 Django 的程序,速度会更快,响应也会更灵敏。
你可以在你的 nginx 配置中添加以下内容:
location /login {
# redirect to secure page [permanent | redirect]
rewrite ^/login(.*) https://www.mysite.com/login permanent;
}
基本上就是把任何 /login 的请求重定向到它的 https 版本。
希望这对你有帮助。
更新
确保你监听 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
}
}
这些重定向更适合在你的网页应用中配置,而不是在Nginx中。虽然你可以在Nginx里硬编码重定向,但在Python中设置会更简单,因为它和你的视图直接相关。
这只是我的个人看法。
在djangosnippets上有很多SSL重定向的中间件,可以把网址重定向到https。
这里有一个使用装饰器的例子,你只需要在你的视图上加上@secure
就可以了。
http://djangosnippets.org/snippets/1999/
我个人使用的是这个稍微修改过的版本 http://djangosnippets.org/snippets/880/,在settings.py
文件中设置某些网址路径为SSL。
例如,在我的配置中,我有:SSL_URLS = ( '/cart/', '/checkout/', '/accounts/' )