Nginx

使用 nginx 和 varnish 進行 Django 移動模板檢測

  • April 26, 2016

我試圖django-mobile在清漆和 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 是邪惡的,所以我想知道這是否是這裡的問題。

結果發現這裡發布的配置(這是我的本地工作站)不是我粘貼在伺服器上的。一旦我確定它是相同的,一切正常。傻我。

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

引用自:https://serverfault.com/questions/771729