2014-07-03 47 views
17

我使用Nginx作爲網絡服務器,並希望實現瀏覽器緩存方法,以便用戶在本地保留靜態不變的文件的副本,並只下載更改的文件。其中一個命題是使用文件時間戳來找出已更改的文件並僅對其進行刷新,但在我的情況下這是不可能的,因爲在每次新部署之後,將創建新版本的整個Web應用程序並創建所有文件的時間戳更改。如何在Nginx上配置ETag

我研究了一下ETag頭文件,它似乎是一個很好的解決方案,但是我發現Etags還沒有被Nginx官方支持。

是否有任何方法在Nginx上實現Etags或其他解決方案?

+1

如果您使用'gzip off;'行禁用'gzip',則可以在您的響應中看到'etag'標頭。 – efkan

+2

請記住,nginx使用該文件的上次修改日期和文件大小來生成etag。 –

+0

如果你看到一個安全掃描器(Nikto等)關於etags泄露inode的投訴,如果你正在運行nginx,可能是誤報,因爲[nginx不包括etags中的inode](http://serverfault.com/questions/690341 /算法隱藏-nginx的-ETAG代)。它可以在apache中禁用,儘管默認情況下apache會泄漏inode(參見'FileETag'指令)。 – Synchro

回答

27

升級你的Nginx。

Syntax:  etag on | off; 
Default: etag on; 

Context: http, server, location 

This directive appeared in version 1.3.3. 

Enables or disables automatic generation of the 「ETag」 response header field for static resources. 

來源:http://nginx.org/en/docs/http/ngx_http_core_module.html#etag

+8

謝謝,我已經試過了,Etag頭文件被添加到了HTTP頭文件中,但是,即使我刪除了Last Modified頭文件,緩存驗證依然依賴於文件的時間戳。我想要檢查這些文件是否真的有內容變化,而不僅僅是通過驗證文件的時間戳 – HanouaJ

7

所有最近Nginx的版本(如2016年),會自動將這些。

例如:

location /img { 
    root /path/to/public; 
} 

和響應標頭Etag + Last-Modified頭將被返回。