ssi+memcached key=??
Maxim Dounin
mdounin на mdounin.ru
Ср Апр 14 03:30:40 MSD 2010
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