开启cloudflare

  1. 打开cloudflare官网,照着提示做,把自己的域名交给cloudflare管理即可,选免费计划
    这里比较技术性的就只有修改自己域名的namesevers,这个得看你在哪买的域名
    总之cloudflare会为你提供两个namesever
    image.png
  2. 之后去域名管理那里改掉namesever即可,注意只能保留这两个,其他全删掉
    image.png
    稍等一段时间就能看到自己的域名已经在cloudflare上有效了
    后续你的域名就可以在cloudflare上管理了,只有续费需要回到购买域名的地方

写在前面

记得把之前的域名都改成新设的自定义域名,不然会有未知错误
虽然访问原域名大部分时候也会重定向到新域名

github pages配置

  1. 去到dns设置,一般来说cloudflare可以检测到大部分过去的dns选项,如果没有就再设置一次
    image.png
    github一共五个dns配置
    四个A类型的,指向github的185.199系列ip
    一个cname类型的,指向过去分配的github pages 地址

  2. 去到github项目配置,选settings,进入pages页,在最下面添加自己的域名即可
    github会自动进行dns检测,如果上一步没问题应该可以显示dns配置正常
    然后可以打开强制https,GitHub会帮你到Let’s Encrypt申请一个SSL证书,这样与你的网站的连接就都是加密的,浏览器也不会显示危险网页了

  3. 虽然github会自动为你的repo添加一个cname文件,使得你不用自行操作,但是每次部署都要来设置一次自定义域名

twikoo配置

没什么难度,dns配置见上图,就两个

  • 一个是A类型的指向vercel的国内专供ip76.223.126.88
  • 一个是cname指向vercel的国内专供dns地址`cname-china.vercel-dns.com

然后到vercel上给项目绑定个新域名,dns检查通过就行,vercel上只用绑定一次

记得改一下配置文件的envId

picbed配置

picbed用cloudflare有点技术活,需要使用cloudflare提供的worker

  1. 登录到 Cloudflare 的管理界面后,点击侧边栏的 “Workers” 选项,然后点击 “创建服务” 创建一个 Worker,现在似乎会提供一个helloworld的例子,无所谓,直接选helloworld修改也行

如果是直接创建记得选http处理程序服务
给worker取个名字,部署,然后进入修改代码

  1. 将下面的代码复制粘贴到编辑页面的代码编辑器中
    注意修改两个路径,一个是代理路径,一个是token,注释里有写

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    /**
    * Welcome to Cloudflare Workers! This is your first worker.
    *
    * - Run "npm run dev" in your terminal to start a development server
    * - Open a browser tab at http://localhost:8787/ to see your worker in action
    * - Run "npm run deploy" to publish your worker
    *
    * Learn more at https://developers.cloudflare.com/workers/
    */

    // Website you intended to retrieve for users.
    const upstream = "raw.githubusercontent.com";

    // Custom pathname for the upstream website.
    // (1) 填写代理的路径,格式为 /<用户>/<仓库名>/<分支>
    const upstream_path = "/GodKeawa/picbed/main";

    // github personal access token.
    // (2) 填写github令牌
    const github_token = "<your token>";

    // Website you intended to retrieve for users using mobile devices.
    const upstream_mobile = upstream;

    // Countries and regions where you wish to suspend your service.
    const blocked_region = [];

    // IP addresses which you wish to block from using your service.
    const blocked_ip_address = ["0.0.0.0", "127.0.0.1"];

    // Whether to use HTTPS protocol for upstream address.
    const https = true;

    // Whether to disable cache.
    const disable_cache = false;

    // Replace texts.
    const replace_dict = {
    $upstream: "$custom_domain",
    };

    addEventListener("fetch", (event) => {
    event.respondWith(fetchAndApply(event.request));
    });

    async function fetchAndApply(request) {
    const region = request.headers.get("cf-ipcountry")?.toUpperCase();
    const ip_address = request.headers.get("cf-connecting-ip");
    const user_agent = request.headers.get("user-agent");

    let response = null;
    let url = new URL(request.url);
    let url_hostname = url.hostname;

    if (https == true) {
    url.protocol = "https:";
    } else {
    url.protocol = "http:";
    }

    if (await device_status(user_agent)) {
    var upstream_domain = upstream;
    } else {
    var upstream_domain = upstream_mobile;
    }

    url.host = upstream_domain;
    if (url.pathname == "/") {
    url.pathname = upstream_path;
    } else {
    url.pathname = upstream_path + url.pathname;
    }

    if (blocked_region.includes(region)) {
    response = new Response(
    "Access denied: WorkersProxy is not available in your region yet.",
    {
    status: 403,
    }
    );
    } else if (blocked_ip_address.includes(ip_address)) {
    response = new Response(
    "Access denied: Your IP address is blocked by WorkersProxy.",
    {
    status: 403,
    }
    );
    } else {
    let method = request.method;
    let request_headers = request.headers;
    let new_request_headers = new Headers(request_headers);

    new_request_headers.set("Host", upstream_domain);
    new_request_headers.set("Referer", url.protocol + "//" + url_hostname);
    new_request_headers.set("Authorization", "token " + github_token);

    let original_response = await fetch(url.href, {
    method: method,
    headers: new_request_headers,
    body: request.body,
    });

    let connection_upgrade = new_request_headers.get("Upgrade");
    if (connection_upgrade && connection_upgrade.toLowerCase() == "websocket") {
    return original_response;
    }

    let original_response_clone = original_response.clone();
    let original_text = null;
    let response_headers = original_response.headers;
    let new_response_headers = new Headers(response_headers);
    let status = original_response.status;

    if (disable_cache) {
    new_response_headers.set("Cache-Control", "no-store");
    } else {
    new_response_headers.set("Cache-Control", "max-age=43200000");
    }

    new_response_headers.set("access-control-allow-origin", "*");
    new_response_headers.set("access-control-allow-credentials", "true");
    new_response_headers.delete("content-security-policy");
    new_response_headers.delete("content-security-policy-report-only");
    new_response_headers.delete("clear-site-data");

    if (new_response_headers.get("x-pjax-url")) {
    new_response_headers.set(
    "x-pjax-url",
    response_headers
    .get("x-pjax-url")
    .replace("//" + upstream_domain, "//" + url_hostname)
    );
    }

    const content_type = new_response_headers.get("content-type");
    if (
    content_type != null &&
    content_type.includes("text/html") &&
    content_type.includes("UTF-8")
    ) {
    original_text = await replace_response_text(
    original_response_clone,
    upstream_domain,
    url_hostname
    );
    } else {
    original_text = original_response_clone.body;
    }

    response = new Response(original_text, {
    status,
    headers: new_response_headers,
    });
    }
    return response;
    }

    async function replace_response_text(response, upstream_domain, host_name) {
    let text = await response.text();

    var i, j;
    for (i in replace_dict) {
    j = replace_dict[i];
    if (i == "$upstream") {
    i = upstream_domain;
    } else if (i == "$custom_domain") {
    i = host_name;
    }

    if (j == "$upstream") {
    j = upstream_domain;
    } else if (j == "$custom_domain") {
    j = host_name;
    }

    let re = new RegExp(i, "g");
    text = text.replace(re, j);
    }
    return text;
    }

    async function device_status(user_agent_info) {
    var agents = [
    "Android",
    "iPhone",
    "SymbianOS",
    "Windows Phone",
    "iPad",
    "iPod",
    ];
    var flag = true;
    for (var v = 0; v < agents.length; v++) {
    if (user_agent_info.indexOf(agents[v]) > 0) {
    flag = false;
    break;
    }
    }
    return flag;
    }
  2. 保存后部署运行
    cloudflare worker一天的免费请求额度是100000,也就是说支持一天提供一共100000次的图片加载或上传,可以说是太够用了

  3. 最后给worker一个自定义域名

  • 在 Worker 服务的详情页点击“触发器”,然后点击“添加自定义域”。
  • 输入想要绑定的域名后,点击“添加自定义域”。
    • cloudflare会自动为你添加一个dns解析,可以说是十分的防傻了
  • cloudflare还会为你的图床域名提供SSL,生成需要一段时间,等待生成变为有效状态,到这里,Cloudflare的配置就完成了
  1. 现在去picgo上配置一下自定义域,以后就不用开代理上传了,国内网络也可以直接访问到图片了,不过steam++的加速会导致SSL证书错误,这好像是steam++加速的问题,不开就行