# 【从零开始配置VPS】06：CF Worker 反代 jsDelivr

## 第一步 部署Worker

    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

    // 替换成你想镜像的站点
    const upstream = 'jscdn.limour.top'

    // 如果那个站点有专门的移动适配站点，否则保持和上面一致
    const upstream_mobile = 'jscdn.limour.top'

    const blocked_region = []

    const blocked_ip_address = ['0.0.0.0', '127.0.0.1']

    const replace_dict = {
        '$upstream': 'jscdn.limour.top',
        '//jscdn.limour.top': '//jscdn.limour.top'
    }

    //以下内容都不用动
    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_host = url.host;

        if (url.protocol == 'http:') {
            url.protocol = 'https:'
            response = Response.redirect(url.href);
            return response;
        }

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

        url.host = upstream_domain;

        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.href);

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

            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;

            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');

            const content_type = new_response_headers.get('content-type');
            if (content_type.includes('text/html') && content_type.includes('UTF-8')) {
                original_text = await replace_response_text(original_response_clone, upstream_domain, url_host);
            } 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;
    }

## 第二步 添加路由

- jscdn.limour.top/*

## 第三步 添加替换

    1
    2
    3
    4
    5

    sub_filter_once off;
    sub_filter_types *;
    sub_filter "jscdn.limour.top" "jscdn.limour.top";
    sub_filter "jscdn.limour.top" "jscdn.limour.top";
    sub_filter "jscdn.limour.top/gh/Limour-dev/Sakurairo_Vision/" "jscdn.limour.top/gh/Limour-dev/Sakurairo_Vision/";

从零开始配置VPS
【从零开始配置VPS】06：CF Worker 反代 jsDelivr
https://occdn.limour.top/2502.html
Author
Limour
Posted on
January 5, 2023
Licensed under
【树莓派】将U盘格式化为F2FS格式并挂载 Previous
【从零开始配置VPS】05：Lsky Pro + WebP-SH Next

#### Search

Keyword