ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: ssi+memcached key=??



Hello!

On Tue, Apr 13, 2010 at 07:17:50AM -0400, john2do wrote:

> День добрый!
> 
> Всплыл тут пренеприятнейший момент, а именно:
> имеем index.html вида
> 
> <!--# include virtual="/cache/ssss?docid=12345" -->
> 
> <!--# include virtual="/cache/ssss?docid=8888" -->
> 
> <!--# include virtual="/cache/ssss?docid=9999" -->
> 
> имеем конфиг вида:
>         location / {
>                 ssi on;
>                 root   /home/www;
>                 index  index.html;
>         }
>         location /cache {
>                 default_type text/html;
>                 set $memcached_key "gen|$arg_docid";
>                 memcached_pass 127.0.0.1:11211;
>         }
> 
> приэтом, если запрашивать /cache/ssss?docid=....(тут то что нужно) отдается 
> именно контент который нужен.
> при обработке же ssi странички, отдается(запрашивается в мемкэше) 
> исключительно gen|12345 (лог мемкэша это подтверждает).
> я правильно понимаю что переменная $memcached_key не переопределяется?

Переменные $arg_* кешируются, а подзапросы имеют общее 
пространство переменных с основным запросом (и между собой).  В 
результате кто первый встал - от того и закешировалось...

> это баг-фича? или мои кривые руки?

Это багофича.

> Как быть что бы заработало?

Либо использовать для передачи ключа что-нибудь некеширующееся, 
например uri:

    <!--#include virtual="/cache/12345" -->
    <!--#include virtual="/cache/8888" -->

    location ~ ^/cache/([0-9]+)$ {
        set $memcached_key "gen|$1";
        memcached_pass ...;
    }

Либо накатить какой-то такой патч:

--- a/src/http/ngx_http_variables.c
+++ b/src/http/ngx_http_variables.c
@@ -1937,6 +1937,7 @@ ngx_http_variables_init_vars(ngx_conf_t
         if (ngx_strncmp(v[i].name.data, "arg_", 4) == 0) {
             v[i].get_handler = ngx_http_variable_argument;
             v[i].data = (uintptr_t) &v[i].name;
+            v[i].flags = NGX_HTTP_VAR_NOCACHEABLE;

             continue;
         }


Maxim Dounin

_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://nginx.org/mailman/listinfo/nginx-ru


 




Copyright © Lexa Software, 1996-2009.