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

我试图得到django-mobile (使用不同的模板名称空间,取决于设备types)当varnish和nginx时。 我想我已经想通了,但是用我目前的设置,似乎nginx只使用查询参数设置cookie而不是头,所以事情只有在一个额外的重新加载后才会改变。

这是如此复杂的原因是,清漆可以caching给定url的页面的两个版本(完整和移动)。

清漆configuration

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

nginxconfiguration

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

然后我有自定义的中间件,检查标题,查询参数或cookies找出要服务的味道。

我知道, 如果是邪恶的 ,所以我想知道这是否是这个问题。

在Vanish本身做移动检测,而不是依靠nginx。 它看到了nginx所看到的一切。 你也可以很容易的创build头文件。

所以,例如,

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

现在你需要做的就是添加到最初的正则expression式,或者用elseif添加不同的条件

原来这里发布的configuration(这是我的本地工作站)不是我粘贴在服务器上的。 一旦我确定它是相同的一切工作。 傻我。