Cloudflare Worker GeoIP重定向,匹配URL和回退



我和这个模板一起如下:https://developers.cloudflare.com/workers/examples/country-code-redirect

从本质上讲,我想重定向根域以及匹配URL段塞。

示例:

domain.com=>en.domain.com

domain.com/some-page=>en.domain.com/some-page

我还试图设置一个后备URL,以防国家代码不匹配,这样我没有设置的任何国家代码都会重定向到en.domain.com。我计划将许多不同的国家代码映射到各自的语言URL。

需要将美国和其他英语国家/地区路由到en.domain.com,然后将其他语言/国家/地区设置到各自的子域路径。以下是我正在努力实现的目标,但没有正确实现:

addEventListener('fetch', event => {
event.respondWith(handleRequest(event));
});

const handleRequest = async (event) => {

const {request} = event
const country = request.cf.country
const url = new URL(request.url)
const {hostname, pathname, protocol} = url

const countryMap = {
US: 'en',
FR: 'fr',
ES: 'es',
PA: 'es'
}

if(country)
{
const lang = countryMap.hasOwnProperty(country) ? countryMap[country] : 'en'
const newHostName = `${lang === 'en' ? '' : lang + '.'}${hostname}`

//en = example.com
//fr = fr.example.com
//es = es.example.com
//pa = es.example.com

if(hostname !== newHostName)
{
const redirectUrl = new URL(pathname, `${protocol}//${newHostName}${pathname}`)

return Response.redirect(redirectUrl.href, 301)
}

}

return await fetch(request)
}

如果您能为我们完成这项工作提供帮助,我们将不胜感激。提前感谢!

你能看看这是否适合你吗?

我已经试过了,它满足了你的要求。

addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
const country = request.headers.get('cf-ipcountry')
// Define redirections
const languageRules = new Map([
["ES", 'es'],
["PA", 'es'],
["FR", 'fr']
])

//Get value from key
const languageCode = languageRules.get(country)
// Redirect to language subdomain for custom countries set
if (languageCode) {
const root = ".domain.com"
const url = new URL(request.url)
const path = url.pathname
const protocol = url.protocol
const destinationDomain = protocol + "//" + languageCode + root + path
return Response.redirect(destinationDomain, 301)
}        

// Redirect to english domain for any other country
else {
const root = "en.domain.com"
const url = new URL(request.url)
const path = url.pathname;
const protocol = url.protocol
const destinationDomain = protocol + "//" + root + path
return Response.redirect(destinationDomain, 301)
}
// Process request and return response
const response = await fetch(request)
return response
}

最新更新