使用 nginx 和 varnish 进行 Django 移动模板检测

使用 nginx 和 varnish 进行 Django 移动模板检测

我正在努力django-mobile(根据设备类型使用不同的模板命名空间)在 varnish 和 nginx 后面。我以为我已经搞清楚了,但根据我当前的设置,似乎 nginx 在使用查询参数时只设置 cookie 而不设置标头,因此只有在额外重新加载后才会发生变化。

它如此复杂的原因是 varnish 可以为给定的 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);
}

nginx 配置

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,以确定要提供哪种风格。

我知道if 是邪恶的,所以我想知道这是否是这里的问题。

答案1

在 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 添加不同的条件

答案2

事实证明,这里发布的配置(即我的本地工作站)不是我粘贴在服务器上的配置。一旦我确定它们完全相同,一切就都正常了。我真傻。

相关内容