Re: memcache_key и HTTP Accept-Language

Sergey Shepelev temotor at gmail.com
Thu Dec 4 20:10:58 MSK 2008


Я написал de,en для краткости.
В этом (accept-language de,en) случае у юзера сломанный бравзер,
потому что формат заголовка не соблюдён, если вы хотите придираться.
Перефразируем это в

Accept-Language: de;q=0.9,en;q=0.7

и поведение не меняется, юзер предпочитает de.

2008/12/4 Valery Kholodkov <valery+nginxru at grid.net.ru>:
>
> В этом случае пользователь не предпочитает de, а предпочитает в равной степени как de, так и en. Поэтому выбор de верен.
>
> ----- Исходное сообщение -----
> От: "Sergey Shepelev" <temotor at gmail.com>
> Кому: nginx-ru at sysoev.ru
> Отправленные: Четверг, 4 Декабрь 2008 г 16:40:38 GMT +01:00 Амстердам, Берлин, Берн, Вена, Рим, Стокгольм
> Тема: Re: memcache_key и HTTP Accept-Language
>
> Да, я тоже думаю, что таких несравнимо мало.
>
> Но может быть accept-language de,en
> а владелец создаст контент для en и de.
> Мы увидим, что ru нету и попробуем взять en. А юзер предпочитает de.
>
> 2008/12/4 Борис Долгов <boris at dolgov.name>:
>> А если просто проверять, начинается ли accept-encoding с ru? Если да -
>> ставить русский, если нет - ставить английский. Думаю, таких, кто будет
>> ходить с броузеров, где какой-нить mn;q=0.9;ru;q=0.8;en;q=0.7, несравненно
>> мало, чтобы ими пренебречь.
>>
>> 4 декабря 2008 г. 1:28 пользователь Sergey Shepelev <temotor at gmail.com>
>> написал:
>>>
>>> Спасибо, здорово.
>>> set оказался мощнее чем я думал.
>>>
>>> Только если правильно понимаю, ваш код неправильно обработает случай
>>>
>>> Accept-Language: en;q=0.9,ru;q=0.8
>>>
>>> то есть выберет русский, хотя юзер предпочитает английский. Но
>>> проблема глубже - бекенд не знает своего решения, относительно какой
>>> именно язык будет использован (там есть бекенд второго уровня, который
>>> отдает контент взамен на домен и список языков), поэтому он может
>>> положить в кеш контент по ключу списка языков, например домен#en,ru
>>>
>>> Т.е. что-то вроде
>>>
>>> if ($http_accept_language ~*
>>>
>>> "^(\w\w)-?\w?\w?(;q=\*|;q=\d\.\d),?(\w\w)-?\w?\w?(;q=\*|;q=\d\.\d),?(\w\w)-?\w?\w?(;q=\*|;q=\d\.\d),?")
>>> {
>>>  set $hislang "$1,$3,$5"
>>> }
>>>
>>> но нужны все языки, а не первые 3. И что будет, если указаны только
>>> один/два? "en,," "en,ru," ?
>>>
>>> Я понимаю, что больше двух языков в настройках почти никогда не бывает.
>>> Также я вижу несколько прагматичных решений с разными ограничениями,
>>> типа всё-таки брать первые два языка, остальных юзеров обрабатывать
>>> медленными бекендами, благо всё равно запас производительности
>>> большой. Но как всегда хочется чтоб и красиво и быстро и дешево.
>>>
>>> 2008/12/3 Михаил Монашёв <postmaster at softsearch.ru>:
>>> > Здравствуйте, Сергей.
>>> >
>>> > Хост и язык можно регэкспами через set установить
>>> > http://sysoev.ru/nginx/docs/http/ngx_http_rewrite_module.html#set
>>> >
>>> > и из эти новых переменных потом формировать $memcached_key:
>>> >
>>> >    set  $myhost  $host;
>>> >    if ($host ~* "^.*\.([^.]+\.[^.]{2-4})$" ) {
>>> >        set  $myhost  $1;
>>> >    }
>>> >    set  $mylang  "en";
>>> >    if ($http_accept_language ~* "ru" ) {
>>> >        set  $mylang  "ru";
>>> >    }
>>> >    $memcached_key "parked#$myhost#$mylang"
>>> >
>>> > SS> Парковка доменов. Имеется маленькая кучка fastcgi бекендов, которые
>>> > SS> генерят динамику в зависимости от запрошенного HTTP Host и
>>> > SS> Accept-Language.
>>> > SS> На морде стоит nginx шестой ветки и проксирует всё подряд на
>>> > бекенды.
>>> > SS> Которые либо отдают страничку из кеша, либо генерят и кладут в кеш.
>>> >
>>> > SS> Так как бекенды по сравнению с nginx сильно медленные в целом и
>>> > SS> неасинхронные, хочется не проксировать *каждый* запрос на них, а
>>> > SS> задействовать http_memcached_module.
>>> > SS> Не знаю как составить ключ $memcached_key
>>> > "parked#test-host.tld#ru,en"
>>> > SS> из заголовков
>>> >
>>> > SS> Host: test-host.tld
>>> > SS> Accept-Language: ru-ru;q=1.0,en-us;q=0.9,*;q=0.8
>>> >
>>> > SS> хост понятно, это $host. И то, от него надо откусить www. если есть.
>>> >
>>> > SS> Уверен, что многие сталкивались с такой задачкой. Есть ли готовые
>>> > рецепты?
>>> >
>>> > SS> Писать свой сишный модуль не подходит.
>>> >
>>> > SS> Решаема ли задача в таких условиях?
>>> >
>>> >
>>> >
>>> >
>>> >
>>> > --
>>> >
>>> > С уважением,
>>> > Михаил Монашёв, SoftSearch.ru
>>> > mailto:postmaster at softsearch.ru
>>> > ICQ# 166233339
>>> > http://michael.mindmix.ru/
>>> > Без бэкапа по жизни.
>>> >
>>> >
>>> >
>>
>>
>>
>> --
>> С уважением, Борис Долгов.
>> icq 77556665
>> e-mail boris at dolgov.name
>>
>
> --
> Regards,
> Valery Kholodkov
>


More information about the nginx-ru mailing list