Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: memcache_key и HTTP Accept-Language
- To: nginx-ru@xxxxxxxxx
- Subject: Re: memcache_key и HTTP Accept-Language
- From: "Sergey Shepelev" <temotor@xxxxxxxxx>
- Date: Thu, 4 Dec 2008 20:10:58 +0300
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from:to :subject:in-reply-to:mime-version:content-type :content-transfer-encoding:content-disposition:references; bh=E6n25AQ5Rnh9UkWGB9Abz5EFldBppPtZfOKpnUa4jIc=; b=n/khVnAeOQeaLWn15F6uxDiFKYsMa/lMzVIqXp7xxzQ6wFhI5aGbOdOAHQf37NcTsI hj9/0HiVKgrdcZaVuEVvo59K/J6S0O5A3Lq3SyIOQClVJDEXGV7g9zZKGI3Y86hDZryb hQmR6783WRwrGSuvUcvKiKRSSaRGqVzteG5Hc=
- Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:to:subject:in-reply-to:mime-version :content-type:content-transfer-encoding:content-disposition :references; b=GK8P/oBXP6lkZTBS+bDowH/NG2r5QdROHqD5bHEUZnsmeJyCD3WJi6aG00Mvz+UvJ/ eO54Y3L++mytUdOzre0wlG2Fq3ughLEDjIve9/KxfaHnz+L1C+hsW6JmVHQn4gb5NK4h Ui9je5gZL4tnWBk84r3Qczvlp/iJKuCiNTDww=
- In-reply-to: <14750444.5771228408586479.JavaMail.root@xxxxxxxxxxxxxx>
- References: <1136230.5751228408429941.JavaMail.root@xxxxxxxxxxxxxx> <14750444.5771228408586479.JavaMail.root@xxxxxxxxxxxxxx>
Я написал de,en для краткости.
В этом (accept-language de,en) случае у юзера сломанный бравзер,
потому что формат заголовка не соблюдён, если вы хотите придираться.
Перефразируем это в
Accept-Language: de;q=0.9,en;q=0.7
и поведение не меняется, юзер предпочитает de.
2008/12/4 Valery Kholodkov <valery+nginxru@xxxxxxxxxxx>:
>
> В этом случае пользователь не предпочитает de, а предпочитает в равной
> степени как de, так и en. Поэтому выбор de верен.
>
> ----- Исходное сообщение -----
> От: "Sergey Shepelev" <temotor@xxxxxxxxx>
> Кому: nginx-ru@xxxxxxxxx
> Отправленные: Четверг, 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@xxxxxxxxxxx>:
>> А если просто проверять, начинается ли accept-encoding с ru? Если да -
>> ставить русский, если нет - ставить английский. Думаю, таких, кто будет
>> ходить с броузеров, где какой-нить mn;q=0.9;ru;q=0.8;en;q=0.7, несравненно
>> мало, чтобы ими пренебречь.
>>
>> 4 декабря 2008 г. 1:28 пользователь Sergey Shepelev <temotor@xxxxxxxxx>
>> написал:
>>>
>>> Спасибо, здорово.
>>> 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@xxxxxxxxxxxxx>:
>>> > Здравствуйте, Сергей.
>>> >
>>> > Хост и язык можно регэкспами через 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@xxxxxxxxxxxxx
>>> > ICQ# 166233339
>>> > http://michael.mindmix.ru/
>>> > Без бэкапа по жизни.
>>> >
>>> >
>>> >
>>
>>
>>
>> --
>> С уважением, Борис Долгов.
>> icq 77556665
>> e-mail boris@xxxxxxxxxxx
>>
>
> --
> Regards,
> Valery Kholodkov
>
|