直接贴代码
建议只自己使用,不要公开,否则可能被判断为涉嫌违反CF规则
addEventListener("fetch", event => {
let url = new URL(event.request.url);
url.hostname = "hub.docker.com"; // 修改成需要代理的网站
// 获取请求头中的 User-Agent
let userAgent = event.request.headers.get("User-Agent");
// 屏蔽爬虫和搜索引擎的列表
const blockedUserAgents = [
/googlebot/i,
/bingbot/i,
/baiduspider/i,
/slurp/i,
/duckduckbot/i,
/yandex/i,
/sogou/i,
/exabot/i,
/facebot/i,
/facebookexternalhit/i
];
const isBot = blockedUserAgents.some(pattern => pattern.test(userAgent));
if (isBot) {
// 如果是爬虫或搜索引擎,返回 403 Forbidden
return event.respondWith(
new Response('访问被拒绝', { status: 403 })
);
}
// 构建新的请求头,传递原请求头,并处理必要的字段
let headers = new Headers(event.request.headers);
headers.set('X-Forwarded-For', event.request.headers.get('cf-connecting-ip') || 'unknown');
// 创建新的请求对象
let request = new Request(url, {
method: event.request.method, // 保留原请求方法
headers: headers, // 保留原请求头
body: event.request.method === 'GET' ? null : event.request.body, // 对于 GET 请求,Body 通常是空的
redirect: 'follow' // 自动跟随重定向
});
console.log(`请求: ${url}`);
// 处理请求并返回响应
event.respondWith(
fetch(request)
.then(response => {
// 返回原始响应,没有缓存控制
console.log(`响应状态: ${response.status}`);
return response;
})
.catch(err => {
// 处理请求失败的情况
console.error('请求失败:', err);
return new Response('请求失败', { status: 502 });
})
);
});
增加访问限制密码认证
addEventListener("fetch", event => {
// 设定一个简单的用户名和密码
const validUsername = "user";
const validPassword = "mypassword";
// 获取请求头中的 Authorization
const authHeader = event.request.headers.get("Authorization");
// 检查 Cookie 是否存在认证标记
const cookie = event.request.headers.get("Cookie");
const isAuthenticated = cookie && cookie.includes("authenticated=true");
// 如果没有 Cookie 标记,且没有 Authorization 头或者它不符合 Basic Authentication 格式
if (!isAuthenticated && (!authHeader || !authHeader.startsWith("Basic "))) {
return event.respondWith(
new Response("需要认证才能访问", {
status: 401,
headers: {
"WWW-Authenticate": 'Basic realm="请输入用户名和密码"' // 触发浏览器认证对话框
}
})
);
}
// 如果用户已经认证过,跳过认证步骤
if (isAuthenticated) {
return handleRequest(event);
}
// 提取并解码用户名和密码
const base64Credentials = authHeader.split(" ")[1];
const credentials = atob(base64Credentials);
const [username, password] = credentials.split(":");
// 检查用户名和密码是否正确
if (username === validUsername && password === validPassword) {
// 设置 Cookie,标记用户已认证,并设置 6 小时过期
const headers = new Headers();
headers.set('Set-Cookie', 'authenticated=true; Path=/; Max-Age=21600'); // 6 小时过期
return event.respondWith(
new Response("认证成功!请刷新此页面继续访问。", {
status: 200,
headers: headers
})
);
} else {
// 如果认证失败,返回 401 Unauthorized 并提示
return event.respondWith(
new Response("认证失败", {
status: 401,
headers: {
"WWW-Authenticate": 'Basic realm="请输入用户名和密码"' // 触发浏览器认证对话框
}
})
);
}
function handleRequest(event) {
let url = new URL(event.request.url);
url.hostname = "hub.docker.com"; // 修改成需要代理的网站
// 获取请求头中的 User-Agent
let userAgent = event.request.headers.get("User-Agent");
// 屏蔽爬虫和搜索引擎的列表
const blockedUserAgents = [
/googlebot/i,
/bingbot/i,
/baiduspider/i,
/slurp/i,
/duckduckbot/i,
/yandex/i,
/sogou/i,
/exabot/i,
/facebot/i,
/facebookexternalhit/i
];
const isBot = blockedUserAgents.some(pattern => pattern.test(userAgent));
// 如果是爬虫或搜索引擎,返回 403 Forbidden
if (isBot) {
return event.respondWith(
new Response('访问被拒绝', { status: 403 })
);
}
// 构建新的请求头,传递原请求头,并处理必要的字段
let headers = new Headers(event.request.headers);
headers.set('X-Forwarded-For', event.request.headers.get('cf-connecting-ip') || 'unknown'); // 可以添加客户端 IP
// 创建新的请求对象
let request = new Request(url, {
method: event.request.method, // 保留原请求方法
headers: headers, // 保留原请求头
body: event.request.method === 'GET' ? null : event.request.body, // 对于 GET 请求,Body 通常是空的
redirect: 'follow' // 自动跟随重定向
});
console.log(`请求: ${url}`);
// 处理请求并返回响应
event.respondWith(
fetch(request)
.then(response => {
// 返回原始响应,没有缓存控制
console.log(`响应状态: ${response.status}`);
return response;
})
.catch(err => {
// 处理请求失败的情况
console.error('请求失败:', err);
return new Response('请求失败', { status: 502 });
})
);
}
});
代理访问所有直链
通过动态传入域名的方式,例如:https://test.workers.dev/https://api.github.com
addEventListener("fetch", event => {
event.respondWith(handleRequest(event.request));
});
async function handleRequest(request) {
const originalUrl = new URL(request.url);
const path = originalUrl.pathname;
// 检查是否正确传入目标地址
if (!path.startsWith("/http://") && !path.startsWith("/https://")) {
return new Response("请正确传入目标地址,需要带协议头。", { status: 400 });
}
const targetUrl = path.slice(1) + originalUrl.search; // 构造完整目标 URL
let url;
try {
url = new URL(targetUrl);
} catch (e) {
return new Response("无效的目标 URL", { status: 400 });
}
// 防爬虫:拦截常见 User-Agent
const userAgent = request.headers.get("User-Agent") || "";
const blockedAgents = [
/googlebot/i, /bingbot/i, /baiduspider/i, /slurp/i,
/duckduckbot/i, /yandex/i, /sogou/i, /exabot/i,
/facebot/i, /facebookexternalhit/i
];
if (blockedAgents.some(re => re.test(userAgent))) {
return new Response("访问被拒绝", { status: 403 });
}
// 构造代理请求
const proxyRequest = new Request(url.toString(), {
method: request.method,
headers: cleanHeaders(request.headers),
body: request.method === "GET" || request.method === "HEAD" ? null : request.body,
redirect: "follow"
});
try {
const response = await fetch(proxyRequest);
// 克隆响应头并清理 CSP、X-Frame-Options 等阻止代理的问题
const newHeaders = new Headers(response.headers);
newHeaders.delete("content-security-policy");
newHeaders.delete("content-security-policy-report-only");
newHeaders.delete("x-frame-options");
newHeaders.set("Access-Control-Allow-Origin", "*");
newHeaders.set("Access-Control-Allow-Headers", "*");
newHeaders.set("Access-Control-Allow-Methods", "*");
return new Response(response.body, {
status: response.status,
statusText: response.statusText,
headers: newHeaders
});
} catch (err) {
return new Response("代理请求失败: " + err.message, { status: 502 });
}
}
// 清理 headers(避免 host、encoding 等引发问题)
function cleanHeaders(headers) {
const newHeaders = new Headers();
for (const [key, value] of headers.entries()) {
const lower = key.toLowerCase();
if (
lower === "host" ||
lower === "cf-connecting-ip" ||
lower === "x-forwarded-for" ||
lower === "x-real-ip" ||
lower === "content-length"
) {
continue;
}
newHeaders.set(key, value);
}
return newHeaders;
}
❤️转载请注明出处❤️