sakura icon indicating copy to clipboard operation
sakura copied to clipboard

Jsdelivr 资源失效的解决办法

Open mashirozx opened this issue 2 years ago • 15 comments

批量替换jsdelivr资源镜像

前提:

  • 你需要一台海外服务器
  • 使用 Nginx

如果没有条件,请看最后一行。


对于 Linux / macOS 系统,运行:

sed -i "s/cdn.jsdelivr.net/jsdelivr.example.com/g" `grep -rl 'cdn.jsdelivr.net' Path/To/wp-content/themes/Sakura`

Path/To/wp-content/themes/Sakura 自行替换成你的路径,可通过命令 pwd 获取当前路径

对于 Windows 系统,以管理员身份启动 PowerShell(PowerShell 5 以上,PowerShell 7下载),运行:

Get-ChildItem -Path C:\Path\To\Sakura -File -Recurse | Foreach-Object {
    (Get-Content $_.PSPath) -Replace 'cdn.jsdelivr.net', 'jsdelivr.example.com' | Set-Content $_.PSPath
}

C:\Path\To\Sakura 自行替换成你的路径,可通过命令 pwd 获取当前路径

以上的 jsdelivr.example.com 需要自行替换成自己的 jsdelivr 镜像域名,镜像配置如下(Nginx):

# 缓存路径配置
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=CACHE:10m inactive=7d max_size=1g;

# referer 白名单
map $http_referer $jsdelivr_allow_referer {
    default               0;
    "~example.com"        1; 
    "~example2.com"       1;
}

map $jsdelivr_allow_referer $jsdelivr_disallow_referer {
    0     1;
    1     0;
}

server {
    listen 443 ssl http2;
    server_name jsdelivr.example.com;

    # ssl 配置
    ssl_certificate ~/.acme.sh/mashiro/fullchain.cer;
    ssl_certificate_key ~/.acme.sh/mashiro/mashiro.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;

    # 关闭日志
    access_log off;
    # 指定 DNS
    resolver 8.8.8.8;

    if ($jsdelivr_disallow_referer) {
        return 403 "The referer domain is not allowed to access this resource.";
    }

    location / {
        proxy_redirect off;
        proxy_pass https://fastly.jsdelivr.net;
        proxy_cache_revalidate on;
        proxy_set_header Host cdn.jsdelivr.net;

        proxy_cache CACHE;
        # 客户端的缓存时长
        proxy_cache_valid 200 1h;
        proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
        proxy_cache_lock on;
        # 服务器端的缓存时长
        expires 1h;
    }
}

以上需要在能正常访问 jsdelivr 的服务器上配置。如果确实没有条件,需要使用我的镜像,请通过QQ联系我。


其他反向代理方案:

无成本反向代理Jsdelivr

mashirozx avatar May 25 '22 10:05 mashirozx

所以可爱的白猫大大能不能整个更新捏

mirai-mamori avatar May 25 '22 10:05 mirai-mamori

我自己网站就是这样改的,因为实在太懒了¯_༼ ಥ ‿ ಥ ༽_/¯

mashirozx avatar May 25 '22 10:05 mashirozx

建议配置再加几行,利用nginx的自带的sub模块

        sub_filter_once off;
        sub_filter_types *;
        sub_filter "cdn.jsdelivr.net" "jsdelivr.moezx.cc";

        #需要关闭上游的gzip功能,否则sub模块无法完成筛选操作
        proxy_set_header Accept-Encoding "";

这样一些需要递归请求jsdelivr的插件就能正常工作辣(〜 ̄▽ ̄)〜

huangguiniab avatar May 25 '22 12:05 huangguiniab

建议配置再加几行,利用nginx的自带的sub模块

        sub_filter_once off;
        sub_filter_types *;
        sub_filter "cdn.jsdelivr.net" "jsdelivr.moezx.cc";

这样一些需要递归请求jsdelivr的插件就能正常工作辣(〜 ̄▽ ̄)〜

可能产生性能开销,高流量场景需要注意做好缓存哦

mashirozx avatar May 26 '22 14:05 mashirozx

白猫大大,如果使用的是虚拟主机的话怎么办啊

MyGodKnow avatar May 28 '22 05:05 MyGodKnow

白猫大大,如果使用的是虚拟主机的话怎么办啊

可在自己电脑上批量替换以后再上传,更新了 Windows 的替换脚本

mashirozx avatar May 28 '22 07:05 mashirozx

白猫大,如果使用的是虚拟主机的话怎么办啊

可以在自己的电脑上更新替换Windows以后再上传,更新了的替换脚本

那请问文章里的图片该怎么批量替换啊?一个一个替换太麻烦了

MyGodKnow avatar May 28 '22 13:05 MyGodKnow

白猫大,如果使用的是虚拟主机的话怎么办啊

可以在自己的电脑上更新替换Windows以后再上传,更新了的替换脚本

那请问文章里的图片该怎么批量替换啊?一个一个替换太麻烦了

可以用这个插件:https://wordpress.org/plugins/better-search-replace/#:~:text=Login%20to%20your%20WordPress%20admin,%2C%20and%20then%20%E2%80%9CActivate%20Plugin%E2%80%9D

mashirozx avatar May 28 '22 14:05 mashirozx

请问猫大能留一个qq吗,找了一圈实在是找不到qq

1264038890 avatar Jun 01 '22 00:06 1264038890

你好,我已经在linux运行sed命令并成功更新了 但是浏览器访问网站依然请求失败,而且我服务器和浏览器都可以正常访问 jsdelivr “其中 jsdelivr.moezx.cc 需要自行替换成自己的 jsdelivr 镜像域名,镜像配置如下(Nginx)” 这句话后面的内容我不太理解 是我需要配置这个吗?但是我的nginx有我的配置,我要怎样配置?“自己的 jsdelivr 镜像域名”又是什么意思呢

yiye4 avatar Jun 01 '22 05:06 yiye4

你好,我已经在linux运行sed命令并成功更新了 但是浏览器访问网站依然请求失败,而且我服务器和浏览器都可以正常访问 jsdelivr “其中 jsdelivr.moezx.cc 需要自行替换成自己的 jsdelivr 镜像域名,镜像配置如下(Nginx)” 这句话后面的内容我不太理解 是我需要配置这个吗?但是我的nginx有我的配置,我要怎样配置?“自己的 jsdelivr 镜像域名”又是什么意思呢

需要另外配置一个域名,来做jsdelivr镜像,这些Nginx配置是用来来给镜像域名用的

mashirozx avatar Jun 01 '22 06:06 mashirozx

请问猫大能留一个qq吗,找了一圈实在是找不到qq

我在群里面

mashirozx avatar Jun 01 '22 06:06 mashirozx

完美运行,用npm代理了jsdelivr

907739769 avatar Feb 05 '23 12:02 907739769

image 我快要崩溃了,就是改不出来

yuxintong12 avatar Oct 30 '23 18:10 yuxintong12

求求各位大大帮帮我吧

yuxintong12 avatar Oct 30 '23 18:10 yuxintong12