对于 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

接下来把反向代理稍微改一下,locationproxy_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 的诸如搜索相关的功能,也都是正常的。如果有朋友还有什么建议,虚心学习一下。

嘻嘻。