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

0 投票
2 回答
3982 浏览
提问于 2025-04-16 09:51

我有一个网站,里面有一个登录页面,我需要让这个页面使用https。这个网站是用django搭建的,运行在apache上,前面有一个nginx作为反向代理,主要做两件事:

1) 提供所有django的静态内容

2) 配置支持ssl

ssl的设置都已经完成,看起来也正常工作……也就是说,我可以顺利访问这两个链接:

http://www.mysite.com/login

https://www.mysite.com/login

没有任何问题,https也会让我验证证书等等。

我遇到的问题是,我想设置nginx,让用户在非https的登录页面上无法输入密码。我一直无法实现这个重定向。

有没有人能解释一下这是怎么回事?

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

谢谢!

2 个回答

1

关于将网址 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 
   }
}
1

这些重定向更适合在你的网页应用中配置,而不是在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/' )

撰写回答