前言

最近 jsdelivr 又挂了,使得隔壁 hexo 博客无法访问

我一开始则是沿用之前的解决方案,将 jsdelivr 上的静态资源导入当阿里云OSS,然后替换网址

比较遗憾的是这种方式虽然可行但是特别麻烦

也是在转移静态资源时发现的,主题引入了某个 js,然后这个 js 又通过操作 dom 的方式引入了其它 js ,这样一波操作下来大概就变成了一个树结构 :spray:

不过一想到最后或许还是得把这些静态资源搬到oss就两眼一黑了

暂时的解决方案

因为我的服务器没在大陆,可以正常访问 cdn.jsdelivr.net ,所以就用 go 写了一个代理服务,以此来拿这部分的静态资源

Code

package main

import (
	"fmt"
	"github.com/kataras/iris/v12"
	"github.com/mattn/go-colorable"
	"github.com/rs/cors"
	log "github.com/sirupsen/logrus"
	"io"
	"io/ioutil"
	"net/http"
	"strings"
)

func main() {
	// log样式配置
	log.SetFormatter(&log.TextFormatter{ForceColors: true})
	log.SetOutput(colorable.NewColorableStdout())

	app := iris.New()
	c := cors.New(cors.Options{
		AllowedOrigins:   []string{"*"},
		AllowCredentials: true,
		Debug:            false,
	})
	app.WrapRouter(c.ServeHTTP)
	app.Get("/static", Static)
	err := app.Listen(":7072")
	if err != nil {
		return
	}
}

// CdnRequestCount cdn请求计数器
var CdnRequestCount = 0

// Static
// @Description:
// @param ctx
func Static(ctx iris.Context)  {
	ip := ctx.GetHeader("X-Real-IP")
	if ip != "" {
		CdnRequestCount++
		log.Info("✨ 第【", CdnRequestCount ,"】次请求,", "【请求ip】", ip)
	}

	defer ErrorHandle(ctx)

	originalUrl := ctx.URLParam("url")
	url := "https://cdn.jsdelivr.net"
	if originalUrl[0:1] == "/" {
		url += originalUrl
	} else {
		url += "/" + originalUrl
	}
	res, err := http.Get(url)
	if err != nil {
		fmt.Println(err)
	}
	defer func(Body io.ReadCloser) {
		err := Body.Close()
		if err != nil {

		}
	}(res.Body)
	body, _ := ioutil.ReadAll(res.Body)
	str := string(body)
	// 替换 cdn.jsdelivr.net
	str = strings.ReplaceAll(str, "https://cdn.jsdelivr.net", "https://localhost:7072/static?url=")
	_, err = ctx.Write([]byte(str))
	if err != nil {
		panic(err.Error())
	}
}

// ErrorHandle
// @Description:
// @param ctx
func ErrorHandle(ctx iris.Context) {
	if r := recover(); r != nil {
		Result(ctx, 500, r, nil)
	}
}

// Result
// @Description:
// @param ctx
// @param code
// @param msg
// @param data
func Result(ctx iris.Context, code int, msg interface{}, data interface{}) {
	_, err := ctx.JSON(iris.Map{
		"code": 500,
		"msg":  msg,
	})
	if err != nil {
		return
	}
}


Ex - ploooosion!