Nginx
使用 nginx 和 varnish 進行 Django 移動模板檢測
我試圖
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 添加不同的條件