Re: memcache_key и HTTP Accept-Language

Sergey Shepelev temotor at gmail.com
Thu Dec 4 20:12:43 MSK 2008


Теоретически возможно что владелец создаст контент на любом количестве
разных языков.
Практически сводится к двум основным с огромным перевесом русского.

2008/12/4 Борис Долгов <boris at dolgov.name>:
> Гм, а там возможны не только ru и en?
> Тогда, наверно, можно смотреть по первому, и если его нет, отдавать en.
>
> 4 декабря 2008 г. 18:40 пользователь Sergey Shepelev <temotor at gmail.com>
> написал:
>>
>> Да, я тоже думаю, что таких несравнимо мало.
>>
>> Но может быть 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
>> >
>
>
>
> --
> С уважением, Борис Долгов.
> icq 77556665
> e-mail boris at dolgov.name
>


More information about the nginx-ru mailing list