Acontece que a configuração postada aqui (que é minha estação de trabalho local) não é o que eu colei no servidor. Uma vez que me certifiquei de que era idêntico, tudo funcionou. Tola eu.
Estou tentando obter django-mobile
(usa um namespace de modelo diferente dependendo do tipo de dispositivo) quando estiver atrás do verniz e nginx. Eu pensei que tinha descoberto, mas com a minha configuração atual, parece que o nginx só define o cookie e não o cabeçalho ao usar parâmetros de consulta, então as coisas só mudam depois de um recarregamento adicional.
A razão pela qual é tão complicado é que o verniz pode armazenar em cache duas versões da página (completa e móvel) para um determinado URL.
sub vcl_hash {
hash_data(req.http.X-Flavour);
hash_data(req.url);
if (req.http.host) {
hash_data(req.http.host);
} else {
hash_data(server.ip);
}
return (hash);
}
location / {
# default flavour
set $flavour "full";
# autodetect mobile flavour
if ($http_user_agent ~* "(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino") {
set $flavour "mobile";
}
# get previously set flavour from cookie
if ($cookie_flavour) {
set $flavour $cookie_flavour;
}
# actively changing flavours with ?flavour=xxx
if ($arg_flavour ~* 'full|mobile') {
set $flavour $arg_flavour;
add_header Set-Cookie "flavour=$arg_flavour; Path=/";
}
# set header for varnish to vary on
proxy_set_header X-Flavour $flavour;
proxy_pass http://127.0.0.1:8000/;
}
Eu, então, tenho um middleware personalizado que verifica o cabeçalho, os argumentos de consulta ou os cookies para descobrir qual sabor servir.
Eu sei que se é mal , então estou pensando se isso é o problema aqui.
Faça a detecção de dispositivos móveis no próprio Vanish, em vez de confiar no nginx. Veja tudo o que o nginx vê. Você pode criar cabeçalhos facilmente também;
Então, por exemplo;
#Set http header
sub vcl_recv {
if req.http.User-Agent ~ "iP(hone|od|ad)" || req.http.User-Agent ~ "Android" ) {
set req.http.X-Device = "smart";
}
}
# Use it for object hashing
sub vcl_hash {
# If we've set a device hint header, cache based on it
if ( req.http.X-Device ) { hash_data(req.http.X-Device); }
}
Tudo o que você precisa fazer agora é adicionar a regex inicial ou adicionar condicionais diferentes com um elseif