首页 > 解决方案 > 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)
}

任何帮助完成这项工作将不胜感激。提前致谢!

标签: cloudflarecloudflare-workers

解决方案


你能看看这对你有用吗?

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

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
}

推荐阅读