Nginx下HTTP强制重定向至HTTPS

对于nginx来说,配置http强制重定向至https有多种多样的写法。可以直接rewrite,也可以用301重定向。但是从网上找到的大多数都有问题,并且还应该顾及到具体的情况,所以这里要进行一定的分析。

首先,从官方文档来看,通过对整个域名通过正则匹配进行rewrite,然后以此来重定向至https的链接的方法官方是不推荐的(可见http://wiki.nginx.org/Pitfalls#Taxing_Rewrites)那么因此,首先重定向的语句应该写成:

return 301 https://$server_name$request_uri;

接着是重定向的语句应该放在哪里的问题。

对于编译安装的nginx,/usr/local/nginx/conf/nginx.conf默认包含了两个server段,一个是默认开启的,监听80端口;另一个被注释掉了,监听443端口(也即SSL所需的端口)。这两个端口分别使用各自的server段。也就是说只要将80端口server段下的站点location设置复制到443端口server段下面,这样就可以直接在80端口server段里面添加重定向语句以达到重定向的目的。

对于其他方式安装的nginx,或者自行修改过nginx.conf,那么可能不包括443端口server段。这时候可以选择像编译安装的默认配置一样,另起一个监听443端口的server段。但是如果说网站已经运行了一段时间,然后写了不少location的配置。这时候,可能更一般的做法是在一个server段里面同时监听80和443端口。这个时候,直接添加重定向语句,势必会造成https访问也会重定向到https。看似没有问题,但是仔细考虑会发现只要一访问,无论是http还是https都会无限地重定向下去。事实上,在这种情况下Chrome会报“重定向循环”的错误。

那么知道问题之后,解决的方案就是只在访问http时重定向。配置如下:

if ( $scheme = http ){
    return 301 https://$server_name$request_uri;
}

这样就可以解决这一问题。

 

 

 


 

最后是上图的惯例

クラウンピースちゃん! | 色谷あすか@お仕事募集中 [pixiv] http://www.pixiv.net/member_illust.php?mode=medium&illust_id=52303818

Nginx下HTTP强制重定向至HTTPS》上有4条评论

  1. 找了很多方法,终于找到这个不会循环重定向的方法,但是就是我有二级域名的话,输入二级域名他也会自动跳到根域名去,这该怎么解决呢?

    Google Chrome 51.0.2704.106 Google Chrome 51.0.2704.106 Windows 7 x64 Edition Windows 7 x64 Edition
    • $server_name应该会匹配到当前server段的server_name,所以可能和你的二级域名的配置有关系。
      另外,以我个人的经验来看,现在在生产环境上,基本上都是把监听80和443的server段给分开来写,直接用第一种return的方法会更好,因为nginx配置文件中一定要尽量避免使用if语句(If Is Evil)。

      Google Chrome 56.0.2924.87 Google Chrome 56.0.2924.87 Windows 10 x64 Edition Windows 10 x64 Edition
  2. 你好,但是在http重定向到https这个过程就被劫持了,有什么解决的妙招?

    Google Chrome 65.0.3325.162 Google Chrome 65.0.3325.162 Windows 10 x64 Edition Windows 10 x64 Edition

发表评论

电子邮件地址不会被公开。 必填项已用*标注