ghost+nginx使用https地址时无限301的问题

1. 面临问题

之前的文章中我们已经说明如何使用Let'S Encrypt来进行https的配置.但是在ghost中,如果网站地址配置为https会进行无限301重定向.

2. 原因分析

ghost官方配置说明里,对他们的处理方法进行了详细的说明.

If you just setup SSL for your blog, and leave your url starting with http://, Ghost will serve requests made via HTTPS securely, and leave plain HTTP requests alone. Insecure and secure requests will both be available, and there will be no redirects from one to the other.

If you setup SSL for your blog and change your url to https://, Ghost will serve all requests securely, all requests made via plain HTTP will be redirected to HTTPS. Your blog will always be secure.

根据官方文档描述的内容所示,如果你在config.js中配置http://,ghost程序会保留http的访问地址,并在https访问时使用https.但是这样会产生问题,就是默认的ghost地址将会为http.当然,这不是我们选择的方案.

当配置为https时,ghost会检测访问地址protocol,如果为http://时,会转向为https://.由于我们会使用nginx反向代理到本机对应的端口(此时是http://127.0.0.1:对应端口),所以ghost会自动进行转向.从而进入死循环.

3. 解决方案

ghost本身提供了nginx的转发解决方案来进行本情况的处理,详见此处.

我们需要在nginx转发头中设定ghost需要的头信息.

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
proxy_set_header Host $http_host;  
proxy_set_header X-Forwarded-Proto $scheme;  

修改完成后检测nginx配置是否正确.

service nginx configtest  

如果没有问题,使用reload重新载入新的配置

service nginx reload  

最终,我们可以愉快地使用https访问ghost了.

4. 参考