Skip to content

Instantly share code, notes, and snippets.

@chriskyfung
Created February 8, 2025 07:59
Show Gist options
  • Save chriskyfung/90f561358120ffac58b13d01035542f1 to your computer and use it in GitHub Desktop.
Save chriskyfung/90f561358120ffac58b13d01035542f1 to your computer and use it in GitHub Desktop.
Implement country-based redirection in Cloudflare Workers
/**
* Welcome to Cloudflare Workers! This is your first worker.
*
* - Run "npm run dev" in your terminal to start a development server
* - Open a browser tab at http://localhost:8787/ to see your worker in action
* - Run "npm run deploy" to publish your worker
*
* Learn more at https://developers.cloudflare.com/workers/
*/
// export default {
// async fetch(request, env, ctx) {
// return new Response('Hello World!');
// },
// };
const base = 'https://example.com';
const project = {
prod: '/',
dev: '/staging'
};
const relpath = '/assets/iframe-for-amp.html';
const customParams = '?option=1';
const statusCode = 302;
async function handleRequest(request) {
const url = new URL(request.url);
const { pathname, search, searchParams } = url;
// Return server error if path is not equal to `/` or `/dev`
if (pathname !== '/' && pathname !== '/dev/') {
return new Response('Internal Server Error', { status: 500 });
}
const targetURL = base + project[pathname === '/' ? 'prod' : 'dev'] + relpath;
if (searchParams.get('auto-detect') === '1') {
// Check for country-based redirect
const countryList = ['US', 'AU', 'HK', 'SG']; // Example country list
if (countryList.includes(request.cf.country)) {
return Response.redirect( targetURL + customParams, statusCode);
}
}
if (search) {
return Response.redirect(targetURL + search, statusCode);
}
return Response.redirect(targetURL, statusCode);
// // Pass through other requests
// return fetch(request);
}
addEventListener("fetch", async event => {
event.respondWith(handleRequest(event.request))
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment