How to rewrite location in nginx depending on the client-browser's language?

前端 未结 10 1944
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-02 17:25

How to rewrite location in nginx depending on the client-browser\'s language?

For example: My browser accept-language is \'uk,ru,en\'. When I request locati

10条回答
  •  一整个雨季
    2020-12-02 17:58

    In addition to @Marks answer above which does not honor language preferences. Here's a LUA chunk of code parsing Accept-Language Header value into language and preference value

    -- need two LUA regex cause LUA's default regex is pretty broken
    -- In my opinion a killer argument against using / supporting LUA
    
    rx = "%s*([a-zA-Z-]+)%s*;%s*q%s*=%s*(%d*.?%d+)"
    rx2 = "%s*([a-zA-Z-]+)%s*"
    
    -- (arg .. ",") => concatenation operation
    for chunk in (arg .. ","):gmatch("([^,]*),") do
        lang, q = string.match(chunk, rx)
        if (not lang) then
            lang = string.match(chunk, rx2)
            q = 1.0
        end
        print(string.format("lang=[%s] q=[%s]",lang, tonumber(q * 1.0)))
    end
    

    When applying, I'm getting:

    $ lua demo.lua 'en-US , de , fr ; q = 0.1 , dk;q=1 '
    lang=[en-US] q=[1.0]
    lang=[de] q=[1.0]
    lang=[fr] q=[0.1]
    lang=[dk] q=[1.0]
    
    $ lua demo.lua ' de'
    lang=[de] q=[1.0]
    
    $ lua demo.lua ' de;'
    lang=[de] q=[1.0]
    
    $ lua demo.lua ' de;q'
    lang=[de] q=[1.0]
    
    $ lua demo.lua ' de;q='
    lang=[de] q=[1.0]
    
    $ lua demo.lua ' de;q=0'
    lang=[de] q=[0.0]
    
    $ lua demo.lua ' de;q=0.1'
    lang=[de] q=[0.1]
    

    Eventually I'm using than a LUA script like below to redirect:

    rx = "%s*([a-zA-Z-]+)%s*;%s*q%s*=%s*(%d*.?%d+)"
    rx2 = "%s*([a-zA-Z-]+)%s*"
    
    
    sup = {de = 0, en = 0, dk = 0}       -- supported languages
    win = {lang = "en", q = 0}           -- default values / winner
    
    for chunk in (arg[1] .. ","):gmatch("([^,]*),") do
        lang, q = string.match(chunk, rx)
        if (not lang) then
            lang = string.match(chunk, rx2)
            q = 1.0
        end
        lang = string.lower(lang)
        -- handle only supported languages
        if (sup[lang]) then
            q = tonumber(q)
            -- update winner table if a better match is found
            if (win.q < q) then
                win.q = q
                win.lang = lang
            end
        end
    end
    
    -- which language pref?
    print(string.format("winner: %s",win.lang))
    

    This gives:

    $ lua test.lua 'en-US;q=.7 , de;q=0.9 , fr ; q = 0.1 , dk ; q  =  1 '
    winner: dk
    

提交回复
热议问题