对于 Ghost 团队 来说,关于程序的安全性已经在已知范围内做的足够好,所以自托管的 Ghost 后台界面,(不出意外的话)未來都会固定在 /ghost
这个路径。
从开发团队的视角来说,固定后台控制面板的路径是没有任何问题的,包括一些管理层级的资源和 API 也固定在该路径下(比如搜索功能的 API),这些会更利于系统稳固性和后续开发的便利性。
另外一点,如果是想要隐藏建站程序,那修改后台地址是没有必要的,假设有人想要知道你是用什么程序来建站的,其实完全不需要通过后台管理地址来确定。主流的建站程序,其实打开浏览器的开发者工具看一眼,就能得到很多信息了。
不过用户选择了自行托管程序,当然也会希望会拥有更大程度的自由,比如单纯为了个人习惯来修改后台管理界面的地址。这也是很多人的普遍心理,从隔壁 Wordpress 插件市场就能看出来的,修改后台地址的插件可是有不低的安装量的。
我的博客并没有什么访客,所以我没有过于关注这方面。只是,偶尔想起来的时候,就忍不住要折腾一下。毕竟是个小白,前期算是有踩小坑,不过目前的效果也算是达到了自己的预期了,所以纪录分享一下。
最开始的时候,我使用的方式就是用最简单的,通过 Nginx 来把新地址 /NewAdmin
的流量转发到原始的后台地址 /ghost
上。比如:
# 新地址 /NewAdmin 转发到 /ghost
location /NewAdmin {
proxy_pass http://localhost:2348/ghost;
}
这样的配置完就可以通过 /NewAdmin
进入后台了。但是仅仅这样是不够的,因为旧的地址 /ghost
还是可以正常访问,所以接下来要把旧的地址路径给干掉:
# 让原始地址返回 404 错误
location /ghost {
return 404;
}
直接简单粗暴的给旧地址来个 404 错误,现在算是把后台地址转移了吧。接下来测试一下,来打开原始的 /ghost
管理页面,发现的确无法正常访问了,成功啦。
接下来,第一个坑就随之而来啦~。屏蔽完原始地址的访问后,我们再来访问前面新设置的后台地址 /NewAdmin
时,会发现 /NewAdmin
无法访问了。明明刚刚测试的 时候还行的,为什么现在不行了呢?
转发流量是直接请求的上游(也就是 Ghost 自身)的后台,旧地址返回 404 错误的行为,应该只影响用户才对。 那问题出在哪里呢?
接下来用浏览器的开发者工具看一下吧。
打开浏览器的开发者工具,切到网络面板,然后刷新一下 /NewAdmin
页面,会发现请求里出现了好几个资源被返回了 404。依次点击这些资源,能在他们的请求头信息里面发现,他们请求路径是 /api
和 /assets
。
嗯,似乎有点眉目了。
这时注释掉 Nginx 里对原始后台返回 404 错误,通过浏览器的访问 /ghost
,能从原始后台地址的请求里发现之前 404 的 /api
和 /assets
请求,现在都变成了 /ghost
路径下的资源,也就是 /ghost/api
和 /ghost/assets
了。
从官方一些文档可以知道,Ghost 的 API 和 assets 是固定在 /ghost
路径下的,但是 Nginx 的转发配置导致新的后台地址 /NewAdmin
在被访问时,返回的一些资源地址请求被去掉了 /ghost
,直接替换成了 /api
和 /assets
。
接下来把反向代理稍微改一下,location
和 proxy_pass
后面添加一个 / 符号:
# 在 /NewAdmin 和 /ghost 后面都加一个斜杠
location /NewAdmin/ {
proxy_pass http://localhost:2368/ghost/;
}
配置完后,刷新页面可以 /api
和 /assets
的请求现在变成了 /NewAdmin/api
和 /NewAdmin/assets
。不过新路径的还是 404 错误,就像前面说的,Ghost 程序里面是把 /api
和 /assets
都固定在 /ghost
下面的,我们没必要去为了改后台地址而去折腾 Ghost 程序的代码。接下来怎么弄呢,我们把这些 404 的资源的路径,在内部改写 /ghost
到新地址 /NewAdmin
就好啦。
把之前注释掉的 404 部分解除注释,改完之后重载一下 Nginx,就能发现访问新的后台地址已经可以成功访问并且加载资源了。
最后的最后,其实就只用把 Nginx 配置按照下面这样来改一下就可以了。达到的效果就是直接访问 /ghost
提示 404,访问 /NewAdmin
则可以正常进入后台管理。
# 创建新的后台地址,转发流量到原始的后台地址
location /NewAdmin/ {
proxy_pass http://localhost:2368/ghost/;
}
# 内部重写 /NewAdmin 请求到 /ghost
location ~ ^/NewAdmin/(api|assets)/ {
rewrite ^/NewAdmin/(api|assets)/(.*)$ /ghost/$1/$2 last;
}
# 禁止外部访问原始的后台地址
location /ghost {
error_page 404 = /404;
return 404;
}
因为本人是纯小白,不确定有哪些部分可能会存在不适当配置。目前来说,个人体验上暂时没有遇到过任何问题,包括依赖 API 的诸如搜索相关的功能,也都是正常的。如果有朋友还有什么建议,虚心学习一下。
嘻嘻。