NGINX如何處理HTTP Vary Header

前一篇文章,提到了如何藉由重新設定NGINX Cache Key,移除不會影響網頁內容的參數。這樣的作法雖然可以提升hit rate,但實務上仍會有所限制,這篇就稍做說明…

首先,我使用瀏覽器瀏覽以下網頁
https://test.com.tw/?para1=123&fbcld=XXXXXXXXXX&para2=456
Nginx Cache Key的組成是否如 前一篇文章所說的呢?這疑問可以觀察NGINX的cache檔案內容得到答案。

以下節錄Cache檔案的部分內容,可見fbcld已經不見
KEY: test.com.tw/?para1=123&para2=456
HTTP/1.1 200 OK
Date: Tue, 14 Jan 2020 07:27:02 GMT
Server: Apache
Cache-Control: max-age=0
Expires: Tue, 14 Jan 2020 07:27:02 GMT
Vary: Accept-Encoding,User-Agent
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8

剛提到實務上仍會有所限制,WHY?

以Google文件-行動版網站搜尋引擎最佳化總覽做說明,文中提到現今行動版網站配置方式有以下三種
  1. 回應式網頁設計 /Responsive Web Design
  2. 動態服務 /Dynamic serving
  3. 獨立網址 /Separate URLs
當網站採用動態服務/Dynamic serving 時,必須在HTTP Vary Header 中放入User-Agent。告知瀏覽器、Google BOT、和proxy等服務要依據User-Agent呈現不同內容
Vary: User-Agent
因此,當HTTP Vary Header 有User-Agent時,扮演reverse proxy的NGINX也會依據不同User-Agent存放不同版本的cache檔案。

當我依序在電腦、手機上使用Firefox、Chrome瀏覽下面這網址(共四次)
https://test.com.tw/

接者在NGINX主機上執行以下指令,尋找該網址所對應的KEY,存在哪些檔案中
egrep -ir 'KEY: test.com.tw/\?' *

結果將會找到四個Cache檔案。以我剛剛的瀏覽方式,這也就代表者hit rate為0%
Binary file 24/b3/80c91fb7a091e69604a563bb6338b324 matches
Binary file 2e/7d/a1f16e4ba9fa57309b3d1fba10447d2e matches
Binary file 47/b4/96d8aa13aeaa30c2f01f9d0b044fb447 matches
Binary file 47/f0/a9ff91dddb32df214a91a1689710f047 matches
註:NGINX於 1.7.7.開始支援HTTP Vary Header

上面是依據SEO的角度討論HTTP Vary Header,但在技術面上一般常見討論的是Accept-Encoding。有興趣進一步瞭解,可參考Best Practices for Using the Vary Header。文中有詳細的討論HTTP Vary Header,也包含了上述狀況的解決方向。


參考資料

留言