cloudflare - Cloudflare Worker GeoIP 重定向与匹配 URL 和后备
问题描述
我正在关注此模板:https ://developers.cloudflare.com/workers/examples/country-code-redirect
本质上,我想重定向根域并匹配 URL slug。
例子:
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
}
推荐阅读
- google-tag-manager - ec.js 可以用服务器端 gtm 代理吗?
- drupal-8 - Drupal 仅在显示为页面但不在显示块中时提供选项卡菜单
- javascript - 坐标(纬度,语言)的任何地址?
- ruby - 在单例方法上使用 sorbet 接口抽象
- java - Springboot 获取 api 时间太长,同时多次点击
- javascript - 如何在 Android Esspresso Kakao 测试中点击 webview 按钮
- c# - .net 5 从 HttpRequest 中检索 HttpRequestMessage
- radio-group - 如何默认值 RadioGroup Chakra-ui
- python - io.UnsupportedOperation:不可写,无法写入 .py 文件
- sql - 如何加入并非全部可用的行?