node.js - 关于nginx的ETag的一些问题
迷茫
迷茫 2017-04-17 15:58:54
0
2
597

关于nginx的Etag问题,nginx默认是有Etag的,但是问题就在于:无论你对源代码做了什么改动,比如说改动了注释,改动了空行什么的,ETag都会变。
(但实际上,比如我改动了注释,但是这个注释可能对程序员很重要,对用户来讲是无所谓的,因此ETag是没有必要变化的)

而http权威指南中说Etag解决了这个问题:

有些文档可能被修改了,但所做修改并不重要,不需要让世界范围内的缓存都重装数据(比如对拼写或注释的修改)。

而nginx默认也加了前缀“W/”来标识弱验证器

那这样的话ETag显然没有解决这个问题。

由于笔者对nginx停留在仅供使用的阶段,并没有源码查看和插件编写的经历,所以想问:

nginx有没有办法配置或者现成的插件或者自定义增加一些内容,从而让ETag并不是任意更改都变化,有一定的变通性?或者说 nginx有没有办法自定义ETag的生成规则?

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回覆(2)
Peter_Zhu

這個最好不要去 nginx 那裡去控制,可以在自動化建置的時候控制。例如,webpack 打包的時候就把註解都給去掉。另外也不要透過 ETag 來協商緩存,透過 webpack 設定 hash 來強制緩存。

補充:為什麼不使用 Etag

  1. 你所列舉的這種情況

  2. 協商快取需要 304 ,仍需要發一次請求

  3. 負載平衡時,不同的實體機相同檔案的 inode 不同,會產生不同的 ETag (未實測)

參考:配置錯誤產生的差距:200 OK (FROM CACHE) 與 304 NOT MODIFIED

小葫芦

正確的做法就是不要依賴etag驗證文件是否被修改。
如果你要處理靜態文件快取的問題,應該在網頁連結裡加上特殊的請求參數好讓瀏覽器以為連結改變從而重新請求最新版文件

如果你想要修改註解不引起etag變化,你應該配置好前端自動化流程,把生產環境運行的程式碼和開發的程式碼分開,然後一鍵壓縮混淆去註解程式碼發佈到生產環境

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板