2014-01-11 7 views
7

Я bucketing User-Agents с помощью устройства, используя что-то вроде varnish-devicedetect и сохраняя результат в X-UA-Device по запросу и отклику.Могу ли я изменить свой собственный заголовок?

Я видел несколько recommendations to vary on User-Agent. Любая причина не меняться вместо этого на X-UA-Device? Похоже, было бы лучше, если бы они были ниже по течению.

ответ

3

Поскольку X-UA-Device не доступен по запросу клиента или в любом нисходящем прокси (он создается внутри лака), вы должны варьироваться в заголовке Vary.

0

Хотя возможны изменения на 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ответа заголовка на пользу стороны клиента сценариев , или в надежде, что он будет распознан кэшами ниже по течению.)

+0

Я думаю, что это неправильно, так как 'vcl_deliver' вызывается после того, как сам Varnish сохранил объект в кеше. Если вы хотите кэшировать разные версии одного и того же URL-адреса, вы должны использовать 'vcl_hash' – NITEMAN

+0

. Идея состоит в том, чтобы приложение отправило в заголовок ответа' Vary: X-UA-Device'. Varnish будет хранить эту версию заголовка 'Vary', а также принимать решения о ее ударе/пропуске на основе этой версии. (Varnish _does_ почитает заголовок Vary, поэтому дополнительной логике 'vcl_hash' не требуется.) Переписывая заголовок ответа на' Vary: User-Agent' в 'vcl_deliver', гарантирует, что нисходящие кеши будут вести себя корректно. (Примечание: я проверил это и подтвердил, что он работает с Varnish 3.0.5) –

+0

Это правильно, если обнаружение устройства выполняется вне лака (в приложении), если вы выполняете обнаружение внутри лака (как в исходном вопросе), вы должны позаботьтесь о заголовок Vary на 'vcl_deliver' с чем-то вроде:' if (resp.http.Vary) {set resp.http.Vary = resp.http.Vary + ", User-Agent"; } else {set resp.http.Vary = "User-Agent"; } ' – NITEMAN