From fcfa98151d35a74547c795ccc9f9732e59d7a266 Mon Sep 17 00:00:00 2001 From: Sead Feng Date: Mon, 5 Aug 2024 21:07:24 +0800 Subject: [PATCH] add workers.dev domain support --- README.md | 13 ++++++++++++ workers.dev/index.js | 50 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 workers.dev/index.js diff --git a/README.md b/README.md index 7dc9cfc..44de21e 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,19 @@ Free domain name application: const currentDomain = "example.com"; ``` +#### Use workers.dev default domain? + +This method only supports single domain reverse proxy. + +Here is the code: + +[workers.dev/index.js](workers.dev/index.js) + +```js +// replace to your proxy site domain +const proxySite = 'example.com'; +``` + ### 3. deploy to workers ```sh diff --git a/workers.dev/index.js b/workers.dev/index.js new file mode 100644 index 0000000..6f85756 --- /dev/null +++ b/workers.dev/index.js @@ -0,0 +1,50 @@ +addEventListener('fetch', event => { + event.respondWith(handleRequest(event.request)); +}); + +async function handleRequest(request) { + const url = new URL(request.url); + const host = url.host; + + if (url.pathname === '/robots.txt') { + const robots = `User-agent: * +Disallow: / + `; + return new Response(robots,{ status: 200 }); + } + + + const proxySite = 'www.proxysites.ai'; + const urlPath = url.pathname; + const origin = `https://${proxySite}`; + const actualUrl = new URL(`${origin}${urlPath}${url.search}${url.hash}`); + + const modifiedRequestInit = { + method: request.method, + headers: request.headers, + redirect: 'follow' + }; + + if (!['GET', 'HEAD'].includes(request.method)) { + const requestBody = await request.clone().arrayBuffer(); + modifiedRequestInit.body = requestBody; + } + + const modifiedRequest = new Request(actualUrl, modifiedRequestInit); + + const response = await fetch(modifiedRequest); + + let body = await response.arrayBuffer(); + const contentType = response.headers.get('content-type'); + + if (contentType && (contentType.includes('text/') || contentType.includes('application/x-javascript'))) { + let text = new TextDecoder('utf-8').decode(body); + text = text.replace(new RegExp( proxySite, 'g'), host ); + body = new TextEncoder().encode(text).buffer; + } + + const modifiedResponse = new Response(body, response); + modifiedResponse.headers.set('Access-Control-Allow-Origin', '*'); + return modifiedResponse; + +} \ No newline at end of file