一直想搭建一个自己的个人博客,前期做了一些相关调研,了解和比较了一些自建博客平台,只是一直没有动手去做。终于今天尝试了一下Ghost。我选择了docker部署,这种方式比较方便快捷。最开始使用的是ghost:1-alpine这个版本,在docker-compose.yml中添加配置,然后docker-compose up -d运行,docker容器顺利启动。在nginx中配置好虚拟主机,域名配置好后,在浏览器中输入https://blog.hbfrank.com直接进入Ghost初始化的页面。随后摸索了一下基本功能,又误打误撞地进入到后台管理登录页面。由于系统中还没有注册用户,于是我注册的用户自动成为Owner用户。再然后是删除了系统默认的用户ghost及其博客内容,换了一个免费的简朴的主题,就算告一段落了。
继续浏览ghost官网的介绍,最新的大版本已经到3.0了,貌似后台管理方面有了一些更新。想起DockerHub的ghost仓库中目前版本也已经更新到3-alpine,于是将docker-compose.yml中的版本更改为3-alpine并重新docker-compose up -d,这次下载镜像时间比较长,不过下载完后容器运行还是一次成功。到浏览器中刷新主页面,内容没有变,说明这次更新版本没有影响到已储存的内容和主题。但是在登录后台管理时,提示
Request made from incorrect origin. Expected 'https://blog.hbfrank.com' received ''.
Google了一下,发现GitHub上ghost项目的issues中已经有人反馈过这个问题。问题的根源已经知道是v2.2.1及以后的ghost后端在验证登录请求时会验证接收到的origin字段是否与预期相同,而此处没有接收到预期值,那么是什么原因导致的呢?梳理了他们的讨论,猜测可能的问题有:
- Cloudflare转发流量时丢失了http请求头中相关的内容;
- nginx反向代理过程中丢失了http请求头中相关的内容;
- chrome浏览器的Referrer Policy设置问题导致请求头中没有发送Referrer字段。
1和2跟我这里遇到的问题看起来有点关系,因为我这个博客正好是经过了Cloudflare和nginx的反向代理,不过很快这两个选项被排除,因为我用Edge浏览器试了一下,直接登录成功,看来3的嫌疑比较大。通过F12大法,确认chrome发送的POST请求确实没有包含Referrer字段,而Edge的请求中有。同时登录页面传过来的Referrer Policy字段的值为no-referrer。Google了这个Referrer Policy,了解了相关的含义之后,解决办法有:
- 设置chrome的Referrer Policy;(这条显然不可行)
- 修改ghost后端代码或配置,在登录页面代码中设置Referrer Policy为origin或相当等级;(不好操作且对后续升级不友好)
- 修改nginx反向代理中的配置。
最终选择了方案3,Google并参考了SSO上这个回答以及这篇文章中的内容,在nginx的反向代理配置中加入add_header Referrer-Policy "strict-origin";,再次使用chrome登录后台管理页面,发现问题解决。使用F12大法可以确认后台登录页面的返回头中包含了Referrer Policy: no-referrer-when-downgrade这个字段内容。