Хотя возможны изменения на X-UA-Device
неверене ниже по течению кэшей, сам лак все еще может извлечь выгоду из этой оптимизации, если вы переписать заголовок Вари в vcl_deliver
:
sub vcl_deliver {
if (resp.http.Vary) {
set resp.http.Vary = regsub(resp.http.Vary,
"(?i)X-UA-Device",
"User-Agent");
}
}
Таким образом, лак изменяет свою кэш на X-UA-Device
и вниз по течению кэшей варьируются от User-Agent
.
В вашем вопросе вы упоминали, что вы добавляли X-UA-Device
в заголовок , а также заголовок запроса. В этом случае указанное предложение не будет работать, и вы вместо этого нужно отправить Vary: User-Agent
безоговорочно:
sub vcl_fetch {
set beresp.http.X-UA-Device = req.http.X-UA-Device;
if (!beresp.http.Vary) {
set beresp.http.Vary = "User-Agent";
} elsif (beresp.http.Vary !~ "(?i)User-Agent") {
set beresp.http.Vary = beresp.http.Vary + ", User-Agent";
}
}
(я не был уверен, были ли установка X-UA-Device
ответа заголовка на пользу стороны клиента сценариев , или в надежде, что он будет распознан кэшами ниже по течению.)
Я думаю, что это неправильно, так как 'vcl_deliver' вызывается после того, как сам Varnish сохранил объект в кеше. Если вы хотите кэшировать разные версии одного и того же URL-адреса, вы должны использовать 'vcl_hash' – NITEMAN
. Идея состоит в том, чтобы приложение отправило в заголовок ответа' Vary: X-UA-Device'. Varnish будет хранить эту версию заголовка 'Vary', а также принимать решения о ее ударе/пропуске на основе этой версии. (Varnish _does_ почитает заголовок Vary, поэтому дополнительной логике 'vcl_hash' не требуется.) Переписывая заголовок ответа на' Vary: User-Agent' в 'vcl_deliver', гарантирует, что нисходящие кеши будут вести себя корректно. (Примечание: я проверил это и подтвердил, что он работает с Varnish 3.0.5) –
Это правильно, если обнаружение устройства выполняется вне лака (в приложении), если вы выполняете обнаружение внутри лака (как в исходном вопросе), вы должны позаботьтесь о заголовок Vary на 'vcl_deliver' с чем-то вроде:' if (resp.http.Vary) {set resp.http.Vary = resp.http.Vary + ", User-Agent"; } else {set resp.http.Vary = "User-Agent"; } ' – NITEMAN