關于nginx的Etag問題,nginx默認是有Etag的,但是問題就在于:無論你對源代碼做了什么改動,比如說改動了注釋,改動了空行什么的,ETag都會變。(但實際上,比如我改動了注釋,但是這個注釋可能對程序員很重要,對用戶來講是無所謂的,因此ETag是沒有必要變化的)而http權威指南中說Etag解決了這個問題:有些文檔可能被修改了,但所做修改并不重要,不需要讓世界范圍內的緩存都重裝數據(比如對拼寫或注釋的修改)。而nginx默認也加了前綴“W/”來標識弱驗證器那這樣的話ETag顯然沒有解決這個問題。由于筆者對nginx停留在僅供使用的階段,并沒有源碼查看和插件編寫的經歷,所以想問:nginx有沒有辦法配置或者現成的插件或者自定義增加一些內容,從而讓ETag并不是任意更改都變化,有一定的變通性?或者說 nginx有沒有辦法自定義ETag的生成規則?
2 回答

阿波羅的戰車
TA貢獻1862條經驗 獲得超6個贊
正確的做法就是不要依賴etag驗證文件是否被修改。
如果你要處理靜態文件緩存的問題,應該在網頁鏈接里加上特殊的請求參數好讓瀏覽器以為鏈接改變從而重新請求最新版文件
如果你想要修改注釋不引起etag變化,你應該配置好前端自動化流程,把生產環境運行的代碼和開發的代碼分開,然后一鍵壓縮混淆去注釋代碼發布到生產環境

30秒到達戰場
TA貢獻1828條經驗 獲得超6個贊
這個最好不要去 nginx 那里去控制,可以在自動化構建的時候控制。比如,webpack 打包的時候就把注釋都給去掉。另外也不要通過 ETag 來協商緩存,通過 webpack 設置 hash 來強制緩存。
補充:為什么不使用 Etag
你所列舉的這種情況
協商緩存需要 304 ,仍需要發一次請求
負載均衡時,不同的物理機相同文件的 inode 不同,會生成不同的 ETag (未實測)
- 2 回答
- 0 關注
- 1803 瀏覽
添加回答
舉報
0/150
提交
取消