Ciallo~(∠・ω< )⌒☆

我的博客全家桶方案:网关路由与多实例跳转实现

OK,这是一次通过网关实现的简单实践。

如今市面上有太多眼花缭乱的技术栈可以用来搭博客了。过去我用了将近 5 年的 hexo,如今我想使用 wordpress 。还有 hugo,halo 等等。

这些不同的框架各有好处的同时,还有丰富的主题可以选择。

我个人的主题也是换了又换,从最早的 kratos ,到 icarus 再到 fluid。最近迷上了 wordpress 这里的国产开源主题 puock 。

So,just do it.

想要享受到所有的这些设计和体验,网关的反向代理可以帮助我们实现这一目的。

最初想的时候很简单,直接部署多个站点就完事儿了。

想想有点 low,改改代码跳一下就完事了。干脆都放在一个域名下得了,可以省不少钱。

简单计划一下:

  1. 部署多个博客实例
  2. 给每个实例加个功能,让不同博客实例的内容头可以随意指定 URL 跳转
  3. 反向代理分配不同的子路径给次要实例

技术选型是 Caddy,最近 SSL 管理机构表示未来将逐步减少证书有效期,会把最大有效期减少至约 47 天。

我很早就从 nginx 切换到了 Caddy,原因是阿里云不再提供免费证书了。

记得偶然一次技术冲浪,我发现 Caddy 可以自动申请 SSL 证书,于是我在摸鱼的时候稍微翻了翻 Caddy 的文档。

相比 nginx 他的配置更简单。

我最初接入的两个博客实例分别是 wordpress 和 hexo 。

让 wordpress 支持点击文章跳转到第三方链接

一番搜索,我发现了 wordpress 提供了自定义字段,可以实现这个场景。

进入文章编辑页面,在右上角打开显示选项的 tab,勾选自定义字段

在页面下方添加一个字段,比如说叫 redirect_to,值填一个 url 。

比如说我的主博客实例部署在 master.com,次要实例 1 部署在 master.com/s1/ ,则填 https://master.com/s1/

接下来修改当前主题文件的 template ,以 puock 为例,找到在首页上显示的文章头的元素模板 为 templates/module-post.php

找到对应的 a 标签,将 href 后的内容修改为:

1<?php 
2$redirect_to = get_post_meta( get_the_ID(), 'redirect_to', true );
3$link = $redirect_to ? $redirect_to : the_permalink();
4echo $link ?>"><?php the_title() 
5?>

代码大意就是如果有 redirect_to 字段,就把文章链接改为 redirect_to 的值。

其他的比如 header bar 互相在实例之间跳转,就不做了,对于 wordpress 来说这个很简单。

让 hexo 实现跳转

由于 hexo 是 markdown 语法的,markdown 有文档头也就是 hexo 官方文档上的 Front-matter,因此我们做一个约定,也叫 redirect_to

参考文档:https://hexo.io/zh-cn/docs/variables

hexo 可以通过页面变量 page 来获取到这个 redirect_to

我是先改的 fluid 主题的实例,观察一下,发现文章标题是一个 index-header 类,那么就很好定位了:layout/index.ejs

接下来也是改 template

// 原代码
<a href="<%= post_url %>" target="<%- theme.index.post_url_target %>">
  <%= post.title %>
</a>

// 修改后
<% var redirect_to = post.redirect_to ? post.redirect_to : post_url %>
<a href="<%= redirect_to %>" target="<%- theme.index.post_url_target %>">
  <%= post.title %>
</a>

hexo 的 navbar 跳转,大多主题都有支持,同样也可以直接改模板写死。

让 hugo 实现跳转

其实我也是因为这篇文章才开始去使用 hugo 的,hugo 的文档读起来有一些困难,而且我还是个 golang rookie

出于经验和对模板生成这一最佳实践的信任,花了大概 1.5 h 的时间读了下 hugo 的官方文档,最后发现其实和 hexo 用同样的思路就可以解决。

  1. 定义 front-matter
  2. 学习 hugo 获取 front-matter 的方式
  3. 修改主题使用的 go-template 语法

Params

以 hugo-theme-stack 为例

我修改了以下文件:

details.html

 1<div class="article-title-wrapper">
 2    <h2 class="article-title">
 3        {{ if .Params.redirect_to }}
 4        <a href="{{ .Params.redirect_to }}">
 5            {{ else }}
 6            <a href="{{ .RelPermalink }}">
 7                {{ end }}
 8                {{- .Title -}}
 9            </a>
10    </h2>
11</div>

header.html

1<div class="article-image">
2    {{ if .Params.redirect_to }}
3    <a href="{{ .Params.redirect_to }}">
4        {{ else }}
5        <a href="{{ .RelPermalink }}">
6            {{ end }}

简单观察一下交互行为,替换掉原来注入 href 的值即可。查阅官方文档得到获取 front-matter 的 api 即可。

网关

我还是思考了一下的,把 hexo 实例代理到 /s1/*,那么会有一些问题,css / js 该怎么处理呢 ?

好在官方文档早已想到了这样的问题:

参考文档:配置 | Hexo

通过修改 _config.yml 中的 url & root 可以解决这个问题,

因为是部署到 master.com/s1/ 那么我们直接把 root 改为 /s1/ 即可。

我们假设 wordpress 部署在 11111,hexo 部署在了 22222

1myblog.com {
2    reverse_proxy :11111
3
4    handle /s1/* {
5        reverse_proxy :22222 
6    }
7}

我不会告诉你,我因为网关缓存,以及画蛇添足的 SSL 问题导致,我研究了 4 个小时的 308 强制重定向问题。