普通视图

发现新文章,点击刷新页面。
昨天以前首页

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

2025年4月28日 14:18

我们前面介绍了 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 服务网站

2025年4月3日 15:56

前言

设计和开发领域,免费商用字体和 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【开源】

2024年12月4日 11:03

前端时间家里的路由器坏了,导致一些服务挂掉了,包括自己的博客,闺蜜圈 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 配置教程

2024年11月10日 19:40

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

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

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

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

Amazon CloudFront 免费 CDN 初体验

2024年11月10日 08:58

前几天在呆哥的博客看到了为网站添加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

用cname方式接入CloudFlare,蹭到CloudFlare免费的CDN

2024年11月3日 13:52
没想到,终有一日我也能发个技术贴了,感谢各类收费CDN和WAF的大力支持和不断督促,让我能够绞尽脑汁,研究出一个讨巧的方案,现分享给大家。 起因: 博客换了一个缓存优化插件,国外的,其中有一项图片优化功能,需要和国外的服务器联通才可以使用,...

网站卫士即将停止服务

2024年4月29日 22:00

前言

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

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

奇安信网站卫士停服

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

奇安信网站卫士停服公告

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

还能用什么

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

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

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

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

最后

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

绝不认怂,不举白旗投降(9日反馈结果)

2024年8月8日 14:17
8月9日反馈:还是有效果的,主要是靠两个方案: 一是刷流量的IP段禁用(主要),二是把 User-Agent 不存在 设置为拦截(次要)。 看看今天和昨天的访问流量 以及 防护次数的对比,效果很明显! PS:经过【大佬龙】同学为我的EO防御...
❌
❌