├── README.md └── index.js /README.md: -------------------------------------------------------------------------------- 1 | # 部署 教程 2 | 3 | ## 前提条件 4 | 5 | - 一个已注册的 Cloudflare 账户 6 | - 一个绑定到该账户的域名(域名地址可能会被公开,所以最好用`干净`的域名) 7 | 8 | ## 步骤 9 | 10 | ### 1. 登录 Cloudflare 账户 11 | 12 | 首先,登录到您的 Cloudflare 账户。 13 | 14 | ### 2. 进入 Workers 面板 15 | 16 | 在左侧导航栏中,找到并点击 **Workers 和 Pages**。 17 | 18 | ### 3. 创建一个新 Worker 19 | 20 | 1. 点击 **创建应用程序** 按钮。 21 | 2. 点击 **创建 Worker** 按钮。 22 | 3. 编辑worker名称,点击部署。 23 | 4. 出现部署成功界面后,点击编辑代码 24 | 25 | ### 4. 编辑 Worker 代码 26 | 27 | 1. 在 Worker 编辑器中,填入index.js文件的代码 28 | 29 | 2. 根据您的需求,替换 `allowedIps` 和 `validKey` 的值。 30 | 31 | ### 5. 保存并部署 32 | 33 | 1. 点击 **部署** 按钮,保存并部署您的 Worker。 34 | 35 | ### 6.绑定域名 36 | 37 | 1. 点击 **设置** 按钮,选择 **触发器** 栏目,点击**添加自定义域** 38 | 2. 输入你要绑定的域名,例如new-api-worker.yourdomain.com 39 | 3. 等待域名生效,并测试 40 | 41 | ### 7.删除访问者 IP 标头 42 | 43 | 1. 进入你绑定到该worker的域名,点击 **规则** , **转换规则** ,打开 **删除访问者 IP 标头** 选择,如下图 44 | image 45 | 46 | ### 8. 测试您的 Worker 47 | 48 | 您可以通过发送 POST 请求到您的 Worker URL(例如:`https://new-api-worker.yourdomain.com`)来测试它。确保请求中包含正确的密钥和URL。 49 | 50 | ### 示例请求 51 | 52 | ```bash 53 | curl -X POST https://new-api-worker.yourdomain.com \ 54 | -H "Content-Type: application/json" \ 55 | -d '{"key":"your_secret_key", "url":"https://example.com"}' 56 | ``` 57 | 58 | ### 注意事项 59 | 60 | - 请确保在 Cloudflare 的防火墙规则中正确配置 IP 访问控制。 61 | - 根据您的需求启用或禁用 IP 验证和密钥验证。 62 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | // 验证设置,建议使用CloudFlare的防火墙功能 2 | const allowedIps = ['127.0.0.1']; // 替换为您允许的 IP 地址,建议使用CloudFlare的防火墙功能 3 | const validKey = 'your_secret_key'; // 替换为您允许的密钥,建议使用CloudFlare的防火墙功能 4 | 5 | const enableIps = false; 6 | const enableKey = true; 7 | 8 | addEventListener('fetch', event => { 9 | event.respondWith(handleRequest(event.request)); 10 | }); 11 | 12 | async function handleRequest(request) { 13 | if (request.method !== 'POST') { 14 | return new Response(JSON.stringify({ 15 | success: false, 16 | error: "Only POST method is allowed" 17 | }), {status: 405}); 18 | } 19 | 20 | let requestData; 21 | try { 22 | requestData = await request.json(); 23 | } catch (error) { 24 | return new Response(JSON.stringify({ 25 | success: false, 26 | error: "Invalid JSON" 27 | }), {status: 400}); 28 | } 29 | 30 | const { key, url: originUrl, method = 'GET', headers = {}, body } = requestData; 31 | 32 | if (enableKey) { 33 | if (validKey === 'your_secret_key') { 34 | return new Response(JSON.stringify({ 35 | success: false, 36 | error: "Please set a valid key" 37 | }), {status: 403}); 38 | } 39 | if (key !== validKey) { 40 | return new Response(JSON.stringify({ 41 | success: false, 42 | error: "Unauthorized key" 43 | }), {status: 403}); 44 | } 45 | } 46 | 47 | if (enableIps) { 48 | // 获取请求 IP 地址 49 | const requestIp = request.headers.get('cf-connecting-ip'); 50 | if (!allowedIps.includes(requestIp)) { 51 | return new Response(JSON.stringify({ 52 | success: false, 53 | error: "Unauthorized IP" 54 | }), {status: 403}); 55 | } 56 | } 57 | 58 | if (!originUrl) { 59 | return new Response(JSON.stringify({ 60 | success: false, 61 | error: "URL not provided" 62 | }), {status: 400}); 63 | } 64 | 65 | try { 66 | // 构建请求选项 67 | const fetchOptions = { 68 | method: method, 69 | headers: headers 70 | }; 71 | 72 | // 如果有body且不是GET请求,添加body 73 | if (body && method !== 'GET') { 74 | fetchOptions.body = typeof body === 'string' ? body : JSON.stringify(body); 75 | } 76 | 77 | // 发起请求 78 | const response = await fetch(originUrl, fetchOptions); 79 | 80 | if (!response.ok) { 81 | return new Response(JSON.stringify({ 82 | success: false, 83 | error: "Failed to fetch resource" 84 | }), {status: 502}); 85 | } 86 | 87 | const newHeaders = new Headers(response.headers); 88 | // 添加 CORS 头部 89 | newHeaders.set('Access-Control-Allow-Origin', '*'); 90 | 91 | // 返回 92 | return new Response(response.body, { 93 | status: response.status, 94 | statusText: response.statusText, 95 | headers: newHeaders 96 | }); 97 | } catch (error) { 98 | return new Response(JSON.stringify({ 99 | success: false, 100 | error: "Error fetching resource" 101 | }), {status: 500}); 102 | } 103 | } 104 | --------------------------------------------------------------------------------