【站長工具】jsdelivr掛了后,我是如何拯救我的個人網站的(halo)


前言

眾所周知,在去年年底,知名的免費cdn服務提供商jsdelivr由於大陸域名備案的問題,沒有國內的CDN加速了,目前都只能解析到海外,不但速度慢,還會偶發性無法連接到服務器。因此國內超多網站都受到了影響。
有人說可以批量修改引用的url,都改成 unpkg.com,但實測,我的個人網站上有一半的js和css在這個站點上是沒有的。

由於我的個人站點並沒有提供多少花里胡哨的內容,所以我就想着把所有要從jsdelivr獲取的文件都下載到服務器本地,不再從外部獲取,沒准哪天海外服務都沒了那就芭比Q了。

操作步驟

  1. 打開博客模板文件夾,找出所有包含jsdelivr的鏈接,去重后發現有39個鏈接
    image.png
    image.png

  2. 然后寫入一個文本文件
    image.png

  3. 編寫下載程序
    可以看到這個目錄結構相當復雜,如果要做最少的改動,應該讓下載文件后的目錄與鏈接路徑保持一致,於是我想到了我以前曾經用網際快車下載過整個網站,但這玩意早就過時了,也懶得裝軟件。現在用python應該就可以實現,為避免重復造輪子,這種想法肯定有人也曾有過,於是先搜,輕松找到一篇文章
    image.png
    讓Python自動下載網站所有文件 ! https://zhuanlan.zhihu.com/p/62876301

我把里面的程序復制出來,修改了入口函數,遍歷url列表傳入

import urllib.request
import requests
import re, os
# 基於 https://zhuanlan.zhihu.com/p/62876301 修改

def get_file(url):
    '''
    遞歸下載網站的文件
    :param url:
    :return:
    '''

    if isFile(url):
        print(url)
        try:
            download(url)
        except:
            pass
    else:
        urls = get_url(url)
        for u in urls:
            get_file(u)

def isFile(url):
    '''
    判斷一個鏈接是否是文件
    :param url:
    :return:
    '''
    if url.endswith('/'):
        return False
    else:
        return True

def download(url):
    '''
    :param url:文件鏈接
    :return: 下載文件,自動創建目錄
    '''
    full_name = url.split('//')[-1]
    filename = full_name.split('/')[-1]
    dirname = "/".join(full_name.split('/')[:-1])
    if os.path.exists(dirname):
        pass
    else:
        os.makedirs(dirname, exist_ok=True)
    urllib.request.urlretrieve(url, full_name)

def get_url(base_url):
    '''
    :param base_url:給定一個網址
    :return: 獲取給定網址中的所有鏈接
    '''
    text = ''
    try:
        text = requests.get(base_url).text
    except Exception as e:
        print("error - > ",base_url,e)
        pass
    reg = '<a href="(.*)">.*</a>'
    urls = [base_url + url for url in re.findall(reg, text) if url != '../']
    return urls

if __name__ == '__main__':
    with open('list.txt', 'r') as f:
        lines = f.readlines()
        url_list = []
        for line in lines:
            get_file(line.strip('\n'))
  1. 執行
    將上面的代碼保存成py文件后執行,就會在當前目錄下生成cdn.jsdelivr.net的主目錄及其子目錄和文件
    image.png

  2. 上傳文件夾到服務器
    由於我是使用的halo博客,可以自定義添加靜態資源,直接把下載的gh和npm兩個文件夾整個拖到/root/.halo/static目錄即可
    image.png

  3. 修改博客模板中的鏈接
    這個就容易了,直接打開模板中的所有文件,批量將cdn.jsdelivr.net替換成我網站的域名,並保存,覆蓋到服務器上
    image.png

  4. 最終效果
    image.png

說點題外的

有不少程序員習慣使用國外的免費服務,比如github和本文中提到的jsdelivr,大家也應該已經發現了這兩個東西在國內已經是屬於間歇性抽風的狀態了。
當前國際形勢越來越緊張,把東西放在國外的服務器上所要承擔的風險越來越大,也應該要考慮將國外服務器上的東西遷移回本國了,否則哪天一個制裁,輕則斷連,中則賬號拉黑,重則把你數據直接刪了也說不定。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM