Обнаружение мобильных шаблонов Django с помощью nginx и varnish

Я пытаюсь получить django-mobile (использует другое пространство имен шаблонов в зависимости от типа устройства), когда находится за лаком и nginx. Я думал, что понял это, но с моими текущими настройками кажется, что nginx устанавливает только cookie, а не заголовок при использовании параметров запроса, поэтому все меняется только после дополнительной перезагрузки.

Причина, по которой это так сложно, заключается в так что varnish может кэшировать две версии страницы (полную и мобильную) для данного URL.

varnish config

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);
}

nginx config

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/;
}

Затем у меня есть специальное промежуточное ПО, которое проверяет заголовок, аргументы запроса или файлы cookie, чтобы понять

Я знаю, что если это зло , поэтому мне интересно, не в этом ли проблема.

1
задан 20 April 2016 в 17:27
2 ответа

Оказывается, размещенная здесь конфигурация (это моя локальная рабочая станция) не та, которую я вставил на сервере. Как только я убедился, что все идентично, все работает. Глупый я.

0
ответ дан 4 December 2019 в 06:23

Выполняйте обнаружение мобильных устройств в самом Vanish, а не полагайтесь на nginx. Он видит все, что видит nginx. Вы также можете легко создавать в нем заголовки;

Так, например;

#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); }
}

Все, что вам нужно сделать сейчас, это добавить к исходному регулярному выражению или добавить различные условные выражения с помощью elseif

0
ответ дан 4 December 2019 в 06:23

Теги

Похожие вопросы