/ 分享 / 102 浏览

如何使用Cloudflare Workers反代网站

cloudflare

先注册一个Cloudflare账号和随意一个域名。

登陆CF后台后,点Workers和pages,点创建应用程序,点创建Worker,随意一个worker前置域名(输入你想写的备注英文或者直接点部署也写),再点右上角下面的编辑代码,把里面的默认代码都删除,复制下方所有的代码填入进去,

const upstream = ‘example.com’ ← ‘example.com’里面填你想要反代的站点,比如里面填写bing.com,只需要替换一下example.com为bing.com即可。然后点部署等待完成在返回。依次点worker设置–点触发器里面可以自定义你的域名,需要先将名称服务器解析到cf,然后这里配置你解析的域名即可生效。

 

反代代码如下↓↓↓

 

// 替换成你想镜像的站点
const upstream = 'example.com'
 
// 如果那个站点有专门的移动适配站点,否则保持和上面一致
const upstream_mobile = 'example.com'
 
// 你希望禁止哪些国家访问
const blocked_region = ['KP']
 
// 禁止自访问
const blocked_ip_address = ['0.0.0.0', '127.0.0.1']
 
// 替换成你想镜像的站点
const replace_dict = {
    '$upstream': '$custom_domain',
    '//google.com': ''
}
 
//以下内容都不用动
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;
}


Author: GamerNoTitle
Link: https://bili33.top/posts/CloudFlare-Workers/
Source: GamerNoTitle
Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
Linux服务器自动备份到 Cloudflare R2详细教程
Linux服务器自动备份到 Cloudflare R2详细教程
如何限制liunx服务器systemd日志大小到100M
如何限制liunx服务器systemd日志大小到100M
解决独角数卡在纯IPv6环境下 Gmail SMTP 无法发送邮件的问题(WARP出口方案)
解决独角数卡在纯IPv6环境下 Gmail SMTP 无法发送邮件的问题(WARP出口方案)
新到手的vps必须设置的几个重要设置
新到手的vps必须设置的几个重要设置
摩尔多瓦Moldtelecom Prepaid eSIM 一年保号仅需0.8RMB
摩尔多瓦Moldtelecom Prepaid eSIM 一年保号仅需0.8RMB
Typecho默认的文章地址带有index.php,怎么去掉
Typecho默认的文章地址带有index.php,怎么去掉

0

  1. 此文章暂无评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注