阅读视图

发现新文章,点击刷新页面。

CloudFlare CDNJS:免费加速你的前端资源

我们前面介绍了 CloudFlare 的 R2 服务:Cloudflare R2 对象存储白嫖指南:10G存储+免流量费,打造免费图床,其实 CloudFlare 还有另外一个我们使用比较多的服务,就是 CDNJS 服务。

什么是 CDNJS?

CDNJS 是 Cloudflare 维护的一个免费开源 CDN 服务,专门托管热门的前端库(如 jQuery、React、Vue、Font Awesome 等),开发者只需通过简单的链接引用,就能让全球用户快速加载这些资源,无需自己部署服务器。

它有如下的核心优势:

✅ ​全球加速:依托 Cloudflare 的全球 CDN 网络,资源加载更快。
✅ ​自动同步:与 npm/GitHub 同步,确保使用最新版本。
​完全免费:零成本使用,无需担心带宽费用。
✅ ​广泛兼容:支持传统 JS、ES Modules、WASM 等多种格式。

CDNJS 的发展历程

CDNJS 最初是由 ​Thomas Davis​(前端开发者,当时就职于 Twitter)于 ​2011 年 创建,并联合开源社区共同维护,初期只是托管几十个热门库。

当初发起这个库的最大原因就是为了解决开发者直接托管第三方库(如 jQuery)的痛点:

  • 带宽成本高:小团队或个人开发者自建 CDN 成本高昂。
  • 更新延迟:手动下载和部署库版本效率低下。
  • 全球化需求:当时已有的 CDN(如 Google Hosted Libraries)覆盖节点有限。

2014 年接手 CDNJS 的服务器和网络基础设施,并提供了企业级基础设施和全球 CDN 节点支持。

2016 年引入自动化 npm/GitHub 同步,大幅提升效率。

2020 年开始支持现代 Web 技术(如 WASM、ES Modules)。

为什么需要 CDNJS?

自托管 vs. CDNJS

对比项自托管CDNJS
加载速度依赖自身服务器带宽全球 CDN 加速
维护成本需手动更新版本自动同步最新版
缓存命中率仅限自身用户全球共享缓存,命中率更高
可用性服务器宕机=资源不可用高可用性,99.99% SLA

适用场景

  • 个人博客、小型网站(节省带宽成本)
  • 企业级应用(提升全球访问速度)
  • WordPress 等 CMS(优化前端性能)

如何使用 CDNJS

在 HTML 中直接引用 CDNJS 链接即可:

<!-- 加载 jQuery -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>

<!-- 加载 Font Awesome CSS -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" />

如要增强安全性,可以使用 ​SRI(Subresource Integrity)​ 防止资源被篡改:

<script 
  src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"
  integrity="sha256-kmHvs0M+1Qz9wuZOJ8E6OE2bM4S4n2GeXJ6X5+5ow="
  crossorigin="anonymous"></script>

由于 CloudFlare 在国内没有加速节点,国内访问可能会有些慢,所以推荐一些国内的 cdnjs 的镜像服务:

服务商特点延迟(国内/国外)
CloudFlare
https://cdnjs.cloudflare.com
✅ 全球加速
⚠️ 国内速度较慢
528 ms / 4 ms
又拍云 CDN
https://s4.zstatic.net
✅ 镜像自 Cloudflare CDNJS
✅ 库齐全,国内速度快
30 ms / 8 ms
字节跳动 CDN
https://cdn.bytedance.com
✅ 速度快企业级稳定性
⚠️ 但库较少,仅 JS 无 CSS 库
27 ms / 216 ms
360 前端静态资源库
https://lib.baomitu.com
⚠️ 更新不太及时
⚠️ 库较少
13 ms / 3 ms
SM.MS
https://cdnjs.loli.net/ajax/libs
✅ 镜像自 Cloudflare CDNJS
⚠️ 个人开发者
160 ms / 8 ms
7ED
https://use.sevencdn.com
✅ 镜像自 Cloudflare CDNJS
⚠️ 个人开发者
33 ms / 180 ms

如果你使用的是 WordPress 博客,那么 #WPJAM Basic# 插件也提供了一个前端公共库,让你一键切换,在「WPJAM」-「优化设置」-「增强优化」:

目前已经内置了下面这几家:

cdnjs.cloudflare.com
s4.zstatic.net
cdnjs.snrat.com
lib.baomitu.com
cdnjs.loli.net
use.sevencdn.com

根据上面的推荐,国内最佳可能是 s4.zstatic.net,具体还是需要你自己切换和体验。

CDNJS 总结

CDNJS 是前端开发者的利器,能显著提升资源加载速度并降低维护成本。

  • 全球用户 → 直接使用 cdnjs.cloudflare.com
  • 国内优化 → 切换至 s4.zstatic.net
  • WordPress → 通过 WPJAM Basic 插件一键配置

2025年10+个免费商用字体和 WebFonts 字体 CDN 服务网站

前言

设计和开发领域,免费商用字体和 WebFonts 字体 CDN 服务是提升项目视觉效果和加载效率的关键工具。免费商用字体避免了版权风险,而 WebFonts CDN 则通过全球分发加速字体加载。以下整理了当前主流的免费商用字体库及 WebFonts CDN 平台,涵盖中英文资源,帮助大家一站式解决需求。

免费商用字体和 WebFonts 字体 CDN 服务
免费商用字体和 WebFonts 字体 CDN 服务

免费商用字体库

Google Fonts

Google Fonts 全球最大的开源字体库,提供上千种免费商用字体,包括部分中文字体(如Noto系列)。支持直接嵌入代码或自托管,兼容性强,但国内访问需代理优化。

  • 特点:全球最知名的免费字体库,提供上千种开源字体,涵盖衬线体、无衬线体、手写体等,支持多语言(包括部分中文字体)。所有字体遵循开放字体许可证(OFL),可免费商用且无需额外授权。

Font Squirrel

Font Squirrel

  • 特点:专注于免费商用字体,所有资源均经过版权审核,提供TTF、OTF、WOFF等格式下载,适合网页设计和印刷项目。

猫啃网

猫啃网 国内权威中文免费商用字体平台,收录589款字体,授权信息透明,支持批量下载及在线预览,适合品牌设计和宣传物料制作。

  • 特点:国内领先的中文免费商用字体平台,收录589款字体,授权信息透明,支持在线预览和批量下载。

猫啃网
猫啃网

ZeoSeven Fonts(ZSFT)

ZeoSeven Fonts 提供764款免费商用字体,包含编程字体(如JetBrains Maple Mono)及多语言支持。其内置WebFonts CDN服务,支持HTML、CSS、JS等多种嵌入方式,开发者可快速部署字体并享受全球CDN加速,尤其适合技术博客和国际化项目。

  • 特点:提供764款免费商用字体,涵盖编程字体(如JetBrains Mono)、多语言字体等,支持多种嵌入方式,是开发者的优选。

自由字体

  • 网址自由字体
  • 特点:国内权威免费字体平台,整合全网可商用资源,规避版权风险,适合企业宣传和品牌设计。

DaFont

  • 网址DaFont
  • 特点:海量字体库,部分支持免费商用,需仔细阅读授权说明,适合个性化设计需求。

100font

100font 整合多语种免费商用字体(含中、英、日、韩),同时提供免费图片和音效资源,分类清晰,适合设计师一站式获取素材。

  • 特点:分类清晰,支持中、英、日、韩等多语种字体,同时提供免费商用图片和音效资源。

100font
100font

Google Noto Fonts

  • 网址Google Noto Fonts

  • 特点:谷歌推出的开源字体,覆盖全球语言字符,适合国际化项目。

Windfonts

Windfonts 作为国内首家开源免费中文WebFonts平台,Windfonts 提供中文字体切片服务及CDN分发,支持WordPress插件与API对接。其开源工具链优化了字体分包策略,结合自托管或第三方CDN,可显著提升中文字体加载速度,适用于企业官网及多语言应用。

中文网字计划

中文网字计划 基于Google Fonts的分包技术改进,中文网字计划通过优化字符区间和全球CDN分发,实现中文字体全量级按需加载。开发者可通过其开源工具(如@konghayao/cn-font-split)切割字体并托管至CDN,尤其适合动态内容网站。

FontCDN

FontCDNGithub开源地址预览地址) 是一个开源解决方案,允许用户自托管字体文件并通过CDN分发,支持WOFF2等现代格式压缩。其配置简单,可无缝集成React、Vue等框架,适合需要私有化部署的开发者。

Free Font

Free Font预览地址) 收录可商用的免费英文/汉字字体。收录了 927 个可商用免费字体。

Best Free Fonts

Best Free Fonts 最佳免费字体精选了 214 种免费字体。包括衬线字体、无衬线字体、手写字体和等宽字体。

WebFonts CDN 服务

Cloudflare CDN

Cloudflare CDN 通用CDN服务,支持托管自定义字体文件并开启HTTP/2加速。结合中文网字计划的分包策略,可显著提升中文字体加载效率,尤其适合高流量网站。

Adobe Fonts(原Typekit)

Adobe Fonts 需订阅Adobe Creative Cloud,提供专业字体库及CDN分发,适合设计团队在商业项目中快速调用高质量字体。

独立字体

MiSans

MiSans 是小米公司于2021年推出的开源免费商用字体,最初作为MIUI 13系统的默认字体,现已成为全球语言字体项目MiSans Global的核心成员。其设计以简约清晰、人文易读为原则,覆盖20多种书写系统、600+语言、10万+字符,支持简体中文、繁体中文(港台字形)、拉丁文、日文等多语言场景。

CDN链接示例

<link rel="stylesheet" href="https://font.sec.miui.com/font/css?family=MiSans:400,600:Chinese_Simplify,Latin" />  
<style>  
  :root {  
    --font: "MiSans", -apple-system, sans-serif;  
  }  
</style>  

mozilla-type-family

mozilla-type-family 由 Studio DRAMA 为 Mozilla 定制的字体系列。Mozilla 字体系列有两种风格--Mozilla Headline 和 Mozilla Text。

总结

免费商用字体和 WebFonts CDN 的结合,既能满足版权合规需求,又能提升用户体验。对于中文项目,推荐猫啃网自由字体;国际化和开发场景优先选择Google FontsZeoSeven Fonts。若需进一步优化加载速度,可结合CDN服务如ZeoSeven CDNCloudflare。使用时务必仔细阅读授权条款,避免法律风险。

开发者需根据项目类型(静态/动态、中英文比例)选择工具链,并优先采用 WOFF2 格式压缩及 HTTP/2 加速,以最大化用户体验。

SCDN 放弃 DDNS 回源 — IP 地址回源更新工具 V1.0【开源】

前端时间家里的路由器坏了,导致一些服务挂掉了,包括自己的博客,闺蜜圈 wiki 等。然后就是每天收到各种离线消息。

终于网络恢复之后,感觉一切正常然而,通过 cdn 反问就是回源错误。于是跟技术沟通了一下下下,发现盾云的域名回源竟然存在延迟,并且这个延迟好几个小时,这就比较蛋疼了。所以,每次换了 ip 首先要去设置 ip 地址才能正常回源。

既然,这个东西存在延迟,那么 dnspod 的 vip 的动态 ddns 解析也就没有任何的用了,延迟已经不是动态域名的问题了,是 cdn 域名刷新的问题。

今天早上忽然想到,既然域名有延迟,那就直接 ip 地址回源吧,不过域名太多了也不能每次都改啊。直接尝试代码解决吧,下面就是全部的代码了:

# 盾云SCDN 接口工具
# by:obaby
# https://h4ck.org.cn
# https://oba.by
from datetime import datetime

import requests

username = '邮箱地址'
password = '密码,先设置用户邮箱地址和密码'

def login():
    url = "https://scdn.ddunyun.com/prod-api/login"

    payload = "{\"email\":\""+username+"\",\"password\":\""+password+"\"}"
    headers = {
        'accept': 'application/json, text/plain, */*',
        'accept-language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
        'content-type': 'application/json;charset=UTF-8',
        'origin': 'https://scdn.ddunyun.com',
        'priority': 'u=1, i',
        'referer': 'https://scdn.ddunyun.com/',
        'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"macOS"',
        'sec-fetch-dest': 'empty',
        'sec-fetch-mode': 'cors',
        'sec-fetch-site': 'same-origin',
        'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36'
    }

    response = requests.request("POST", url, headers=headers, data=payload)

    # print(response.json())
    js = response.json()
    if js['code'] == 0:
        return js['data']['access_token']
    else:
        print('[E] 发生错误:', js['message'])
    return None
    # return None


def get_site_list(token):
    url = "https://scdn.ddunyun.com/prod-api/site?domain_name=&sub_domain_name=&cname=&status=&current_page=1&total=0&page_size=20"

    payload = {}
    headers = {
        'accept': 'application/json, text/plain, */*',
        'accept-language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
        'authorization': 'Bearer ' + token,
        # 'cookie': 'LeCDN-Client=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjbGllbnQiLCJleHAiOjE3MzMyOTM5NDcsIm5iZiI6MTczMzI3MTM0NywianRpIjoiNDEifQ.lpSIjvtVGE7wcxZgNF2upZiZ8QsPh2CYajevHqgsjzg; sidebarStatus=0',
        'priority': 'u=1, i',
        'referer': 'https://scdn.ddunyun.com/',
        'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"macOS"',
        'sec-fetch-dest': 'empty',
        'sec-fetch-mode': 'cors',
        'sec-fetch-site': 'same-origin',
        'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36'
    }

    response = requests.request("GET", url, headers=headers, data=payload)

    # print(response.text)
    js = response.json()
    if js['code'] == 0:
        return js['data']['data']
    else:
        print('[E] 发生错误:', js['message'])
    return None


def get_site_source(access_token, site_id):
    url = "https://scdn.ddunyun.com/prod-api/site_source?site_id=" + str(site_id)

    payload = {}
    headers = {
        'accept': 'application/json, text/plain, */*',
        'accept-language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
        'authorization': 'Bearer ' + access_token,
        # 'cookie': 'LeCDN-Client=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjbGllbnQiLCJleHAiOjE3MzMyOTM5NDcsIm5iZiI6MTczMzI3MTM0NywianRpIjoiNDEifQ.lpSIjvtVGE7wcxZgNF2upZiZ8QsPh2CYajevHqgsjzg; sidebarStatus=0',
        'priority': 'u=1, i',
        'referer': 'https://scdn.ddunyun.com/',
        'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"macOS"',
        'sec-fetch-dest': 'empty',
        'sec-fetch-mode': 'cors',
        'sec-fetch-site': 'same-origin',
        'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36'
    }

    response = requests.request("GET", url, headers=headers, data=payload)

    js = response.json()
    if js['code'] == 0:
        return js['data']['data']
    else:
        print('[E] 发生错误:', js['message'])
    return None


def delete_source(access_token, site_id, source_id):
    # url = "https://scdn.ddunyun.com/prod-api/site_source/593?site_id=382"
    url = "https://scdn.ddunyun.com/prod-api/site_source/" + str(source_id) + "?site_id=" + str(site_id)

    payload = {}
    headers = {
        'accept': 'application/json, text/plain, */*',
        'accept-language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
        'authorization': 'Bearer ' + access_token,
        # 'cookie': 'LeCDN-Client=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjbGllbnQiLCJleHAiOjE3MzMyOTM5NDcsIm5iZiI6MTczMzI3MTM0NywianRpIjoiNDEifQ.lpSIjvtVGE7wcxZgNF2upZiZ8QsPh2CYajevHqgsjzg; sidebarStatus=0',
        'origin': 'https://scdn.ddunyun.com',
        'priority': 'u=1, i',
        'referer': 'https://scdn.ddunyun.com/',
        'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"macOS"',
        'sec-fetch-dest': 'empty',
        'sec-fetch-mode': 'cors',
        'sec-fetch-site': 'same-origin',
        'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36'
    }

    response = requests.request("DELETE", url, headers=headers, data=payload)

    js = response.json()
    if js['code'] == 0:
        return js['data']
    else:
        print('[E] 发生错误:', js['message'])
    return None


def edit_source(access_token, site_id, source_id, ip_address):
    url = "https://scdn.ddunyun.com/prod-api/site_source/" + str(source_id)

    payload = "{\"id\":" + str(source_id) + ",\"site_id\":" + str(
        site_id) + ",\"type\":\"ipaddr\",\"content\":\"" + ip_address + "\",\"priority\":\"20\",\"weight\":15,\"created_at\":\"2024-11-25 13:21:23\",\"updated_at\":\"2024-12-01 13:39:13\",\"isEdit\":true}"
    headers = {
        'accept': 'application/json, text/plain, */*',
        'accept-language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
        'authorization': 'Bearer ' + access_token,
        'content-type': 'application/json;charset=UTF-8',
        # 'cookie': 'LeCDN-Client=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjbGllbnQiLCJleHAiOjE3MzMyOTM5NDcsIm5iZiI6MTczMzI3MTM0NywianRpIjoiNDEifQ.lpSIjvtVGE7wcxZgNF2upZiZ8QsPh2CYajevHqgsjzg; sidebarStatus=0',
        'origin': 'https://scdn.ddunyun.com',
        'priority': 'u=1, i',
        'referer': 'https://scdn.ddunyun.com/',
        'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"macOS"',
        'sec-fetch-dest': 'empty',
        'sec-fetch-mode': 'cors',
        'sec-fetch-site': 'same-origin',
        'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36'
    }

    response = requests.request("PUT", url, headers=headers, data=payload)

    js = response.json()
    if js['code'] == 0:
        return js['data']
    else:
        print('[E] 发生错误:', js['message'])
    return None


def add_source(access_token, site_id, ip_address):
    import requests

    url = "https://scdn.ddunyun.com/prod-api/site_source"

    payload = "{\"type\":\"ipaddr\",\"content\":\"" + ip_address + "\",\"priority\":\"20\",\"weight\":15,\"isEdit\":true,\"site_id\":" + str(
        site_id) + "}"
    headers = {
        'accept': 'application/json, text/plain, */*',
        'accept-language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
        'authorization': 'Bearer ' + access_token,
        'content-type': 'application/json;charset=UTF-8',
        # 'cookie': 'LeCDN-Client=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjbGllbnQiLCJleHAiOjE3MzMyOTM5NDcsIm5iZiI6MTczMzI3MTM0NywianRpIjoiNDEifQ.lpSIjvtVGE7wcxZgNF2upZiZ8QsPh2CYajevHqgsjzg; sidebarStatus=0',
        'origin': 'https://scdn.ddunyun.com',
        'priority': 'u=1, i',
        'referer': 'https://scdn.ddunyun.com/',
        'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"macOS"',
        'sec-fetch-dest': 'empty',
        'sec-fetch-mode': 'cors',
        'sec-fetch-site': 'same-origin',
        'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36'
    }

    response = requests.request("POST", url, headers=headers, data=payload)

    js = response.json()
    if js['code'] == 0:
        return js['data']
    else:
        print('[E] 发生错误:', js['message'])
    return None


def update_domain_source(domain_list, new_ip_address):
    token = login()
    print('[T] 获取到 token:', token)
    # 访问 https://www.jetbrains.com/help/pycharm/ 获取 PyCharm 帮助
    site_list = get_site_list(token)
    # new_ip_address = '123.234.187.19'
    # print(site_list)
    for s in site_list:
        # print(s['domain_name'])
        dn = s['domain_name']
        site_id = s['id']
        if dn in domain_list:
            source_list = s['sources']
            # print(source_list)
            print('-' * 100)
            print('[U] 时间:', datetime.now())
            print('[U] 更新域名配置:')
            print('[U] 域名:', dn)
            ip_count = 0
            for sl in source_list:
                source_id = sl['id']
                # site_id = sl['site_id']
                ip_address = sl['content']
                try:
                    if sl['type'] == 'ipaddr':
                        print('[U] 旧 IP 地址:', sl['content'])

                        # edit_source(token, site_id, source_id, ip_address)
                        if ip_address != new_ip_address:
                            print('[U] 更新:正在更新 ip 地址:123.234.187.19')
                            edit_source(token, site_id, source_id, new_ip_address)
                        else:
                            print('[U] 忽略:IP地址无变化')
                        ip_count += 1
                    else:
                        print('[D] 删除:删除域名回源:', ip_address)
                        delete_source(token, site_id, source_id)
                except Exception as e:
                    print('[E] 发生异常:', e)
            # 如果不存在 IP 地址回源 添加 ip 回源
            if ip_count == 0:
                print('[U] 添加:添加IP地址回源:', new_ip_address)
                add_source(token, site_id, new_ip_address)
            print('*' * 100)

    print('[U] 更新完成')
    print('#' * 100)


def print_usage():
    print('*' * 100)
    print('盾云 SCDN 回源地址配置工具')
    print('说明:用于更新盾云 ip 地址回源,解决域名回源导致的延迟问题')
    print('by: obaby')
    print('https://oba.by')
    print('https://h4ck.org.cn')
    print('#' * 100)

if __name__ == '__main__':
    print('*' * 100)
    print('盾云 SCDN 回源地址配置工具')
    print('by: obaby')
    print('https://oba.by')
    print('https://h4ck.org.cn')

然后在需要更新 ip 地址的地方通过下面的代码调用即可:

from baby_dunyun import *

if __name__ == '__main__':
    domain_list = [
        "image.dlj.kim",
        "nai.dog",
        "image.h4ck.org.cn",
        "wiki.guimiquan.cn",
        "baby.lc",
        "danteng.me",
        "loli.gifts",
        "lang.bi",
        "da.bi",
        "zhongxiaojie.cn",
        "oba.by",
        "zhongxiaojie.com",
        "lang.ma",
        "dlj.kim",
        "h4ck.org.cn",
    ]
    new_ip_address = '123.234.187.19'
    update_domain_source(domain_list, new_ip_address)

运行效果:

此工具仅支持盾云 scdn,https://scdn.ddunyun.com/#/dashboard

Amazon CloudFront 免费 CDN 配置教程

三十海河 留言文能不能出个教程,下午看了下正好之前给宝子做的博客挂掉了。正好迁移过来,不过不得不说,这个体验的确比较奇怪,cname解析,有的域名能加,有的不能加,这就很离谱。

视频分两段录的,主要是第一段失败了,但是实在不想重新录了。直接看这两段吧。第一段有些问题,第二段也提到了。

整体用起来的感觉就是,很多翻译有些奇怪,包括文档看的也莫名其妙,这个就很蛋疼。

不过好在最后还是成功了,折腾半天,哼唧唧

Amazon CloudFront 免费 CDN 初体验

前几天在呆哥的博客看到了为网站添加cloudfront的文章,于是昨天把一个没套cdn的域名尝试给加上了cdn。

具体添加的步骤按照呆哥的文章操作就可以啦,然而,在添加完cdn之后,却一直出现问题,报502错误。

按照之前的配置方式,直接添加的http的回源,很可能是这个回源问题,尝试添加http回源,发现http是能访问的。但是https的不行,猜测可能是aws的回源校验证书了,本地服务器用的都是同一个证书(h4ck.org.cn),如果校验证书有效性,那肯定是无法创建链接的。重新申请免费证书之后,这个问题算是解决了。

然而还有另外一个诡异的问题,那就是https://www.obaby.org.cn可以访问,但是https://obaby.org.cn无法访问,报403错误。参考官方的文档,提示是cname问题,域名是dnspod解析的直接给@添加的cname记录。不过这个做法按照dns的国际做法其实是不受支持的,不能直接给@添加cname解析的。只好将域名解析切换到he.net重新创建alias解析。

然而问题依旧,猜测还是配置问题。后来才发现这个东西的异常之处,按照理解添加域名之后,不在需要添加额外的cname了。

然而事实上却是,这个东西不管添加的的时候创建的域名是什么,在这里都需要把添加的时候的域名加进去才能正常匹配到这个cname。

另外一个就是这个源里面的,源域的问题,最外侧的这个名称其实无关紧要。

需要设置的是内部的original domain:

这个对应的才是回源的配置。经过上面的设置之后,终于两个域名都能用了,并且,顺便把ipv6也给开启了。

测速效果,V4:

v6速度:

后台地址:

https://console.aws.amazon.com

网站卫士即将停止服务

前言

在我做博客的初期,尝试过各家提供的免费 CDN,尤其是在使用又拍云被刷流量导致欠费以后,我便更加青睐具有一定安全性的 CDN,奇安信网站卫士便是之一。

奇安信网站卫士前身是 360 网站卫士,后来奇安信从奇虎 360 分离出来成为了单独的公司,这个业务也就由奇安信来运营。

奇安信网站卫士停服

作为一款免费防 DDOS、CC 的高防 CDN,免费为公众提供了这么久的服务已经很良心了。可能受近几年效益的影响,奇安信此前官宣 2023 年年终奖归零,砍掉烧钱又不盈利的公益业务,也是可以理解的。毕竟有许多用户确实有高防的需求,奇安信无偿帮他们扛了这么多年。

奇安信网站卫士停服公告

由于我体验的时期,发现奇安信网站卫士的节点不够快,所以没有持续使用。在后来也算是找到了还不错的下家。

还能用什么

2021年的时候,我写过一篇《国内免费CDN和云存储评测分享》,目前国内提供免费 CDN 的厂商还是很多,并且越来越多的融合厂商和小厂商也为各位站长提供公益的接入。因为经历过被刷流量却没提醒,在这些厂商中,我没再和任何人推荐过又拍云。

如果同时需要云存储和 CDN,我首推融合 CDN 厂商多吉云。多吉云每月有免费 20GB 的 CDN流量,10GB 的云存储,还有 20GB 的视频云。多吉云主要使用的是腾讯云的 CDN,节点和速度上都有很不错的体验。工作人员曾说过,在设置了安全策略还是导致流量被刷,可以申请减免。后来我被刷过一次,虽然用不上补偿流量包,但是多吉云还是给了补偿。

如果对安全性有一定的要求,我推荐上海云盾。上海云盾不限流量,但是限制 5Mbps 带宽。体验版有一定的限制,并且 DDOS 直接回源。此前有大量用户涌入云盾,导致节点速度收到过一定程度的影响。

此外就是一些象征性收费或者完全免费的公益厂商,比如火毅盾、盾云安全、括彩云等等。但是我不建议使用控制台功能不够完善的服务,比如连基本的 QPS 限制、流量封顶策略之类的功能都没有,被刷流量又会带来一笔很大的费用。

最后

我打心底里感激这些为站长和博主们提供公益服务的厂商,也深知用爱发电需要很大的勇气和支出。不管用哪家的服务,一定要设置好安全策略,避免被别有用心的人攻击。当然,使用公益服务也要合法合规,不要滥用。一方面是支持和保护提供公益服务的厂商,另一方面也是保护自己。

❌