2014-10-27 5 views
1

Я пытаюсь извлечь данные из моего (PHP) бэкэнд с помощью ESI в Varnish 4.x. Я хочу сохранить (кеш) результат в моем экземпляре Varnish. Результат уникален для каждого IP-адреса (client.ip), поэтому хэш для кэшированного результата должен быть построен с включенным client.ip. Лак не кэшируется, как ожидалось. Я не могу кэшировать на основе IP. Чтобы дать вам представление о том, что я пробовал, см. Ниже.Как кэшировать фрагмент ESI и соответствующий вывод с помощью Varnish 4.x по IP

unique.js:

var rand = '<esi:include src="/unique.php"/>'; 

unique.php:

<?php echo rand(); ?> 

default.vcl (экстракт):

sub vcl_recv { 
    if (req.url ~ "^/unique.(js|php)") { 
     set req.http.marker = client.ip; 
    } 
} 

sub vcl_hash { 
    if (req.http.marker) { 
     hash_data(req.http.marker); 
    } 
} 

sub vcl_backend_response { 
    if (bereq.url == "/unique.js") { 
     set beresp.do_esi = true; 
     set beresp.ttl = 24h; 
    } elseif (bereq.url == "/unique.php") { 
     set beresp.ttl = 30d; 
    } 
} 

Очевидно я что-то отсутствует. Любые намеки приветствуются!

ответ

0

Я не думаю, что в сообщении достаточно информации, чтобы дать вам окончательный ответ, но я предполагаю, что кеширование работает неправильно по причине, не связанной с вашим кодом ESI.

Как упоминалось в нескольких местах (here is one example), лак по умолчанию не кэширует файлы cookie. Поэтому очень хорошо, что файлы cookie, установленные в JS или код сеанса PHP, заставляют ваш запрос не кэшироваться. Мое предположение было бы, что вам нужно добавить:

unset req.http.cookie; 

внутри if (req.url ~ "^/unique.(js|php)") { блока.

 Смежные вопросы

  • Нет связанных вопросов^_^