Re: memcache_key и HTTP Accept-Language
Борис Долгов
boris at dolgov.name
Thu Dec 4 18:22:37 MSK 2008
А если просто проверять, начинается ли 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://nginx.org/pipermail/nginx-ru/attachments/20081204/d003e34a/attachment.html>
More information about the nginx-ru
mailing list