Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Jsdelivr 资源失效的解决办法 #290

Open
mashirozx opened this issue May 25, 2022 · 15 comments
Open

Jsdelivr 资源失效的解决办法 #290

mashirozx opened this issue May 25, 2022 · 15 comments

Comments

@mashirozx
Copy link
Owner

mashirozx commented May 25, 2022

批量替换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

@mirai-mamori
Copy link

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

@mashirozx
Copy link
Owner Author

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

@huangguiniab
Copy link

huangguiniab commented May 25, 2022

建议配置再加几行,利用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的插件就能正常工作辣(〜 ̄▽ ̄)〜

@mashirozx
Copy link
Owner Author

mashirozx commented May 26, 2022

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

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

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

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

@MyGodKnow
Copy link

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

@mashirozx
Copy link
Owner Author

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

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

@MyGodKnow
Copy link

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

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

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

@mashirozx
Copy link
Owner Author

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

可以在自己的电脑上更新替换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

@Matrtex
Copy link

Matrtex commented Jun 1, 2022

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

@yiye4
Copy link

yiye4 commented Jun 1, 2022

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

@mashirozx
Copy link
Owner Author

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

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

@mashirozx
Copy link
Owner Author

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

我在群里面

@907739769
Copy link

完美运行,用npm代理了jsdelivr

@yuxintong12
Copy link

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

@yuxintong12
Copy link

求求各位大大帮帮我吧

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

8 participants