Will nginx support HTTP Etag?


#1

Hi,
After reading http://wiki.nginx.org, I find out that nginx has not the
offical support for the HTTP Etag,
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.19 . I
want to know whether the future version of nginx will add this
feature.

My website is taking use of nginx to run static files server including
lots of Javascipt and CSS files modified frequently. Now I set a very
short expires time like, expires 1h, to renew the client cache as soon
as possible.

But I think it is not a good solution. It wastes my network bandwidth
if I do not modify the static files. Etag will do it better because it
can renew the client’s cache immediately. Moreover the implement of
this feature is not very hard. One simple method of generating the
ETag is based on the the size and last modified time of the file.

Regards,

e$B2F@6A3e(B
Xia Q.
removed_email_address@domain.invalid
Sent from Beijing, 11, China
Henny Youngman - "I told the doctor I broke my leg in two
places. He told me to quit going to those places." -


#2

Xia Q. wrote:

But I think it is not a good solution. It wastes my network bandwidth
if I do not modify the static files.

If last-modifed date of file is not changed, bandwidth saved:

client send in request

header If-Modified-Since:

and if time in request same as time of file modification on disk nginx
send reply
HTTP/1.x 304 Not Modified

In general Etag for static files is not better than Last-Modified
header.

Etag is useful for dynamic content, when modify time is not known. In
this case Etage can be
generated from hash (md5/sha) of content.


#3

2009/4/14 Xia Q. removed_email_address@domain.invalid:

as possible.

But I think it is not a good solution. It wastes my network bandwidth
if I do not modify the static files. Etag will do it better because it
can renew the client’s cache immediately. Moreover the implement of
this feature is not very hard. One simple method of generating the
ETag is based on the the size and last modified time of the file.

Do what (I do) and other large sites do.

Put a query string parameter on the file. It will make the browser
treat it as a fresh one.

foo.js
foo.js?v=1
foo.js?v=2

(Somewhat thanks to Flickr for validating this concept)

It is also CDN friendly, we use Akamai and it allows us to not have to
purge the cache constantly.

We use our subversion revision number for the ID that goes in the v=
param. This automates it and there is no way for the file to be
updated without going through subversion anyway; it’s kind of a
win/win. I find this to be easy and require less configuration.
However, if you don’t have an automated system you’ll have to remember
when you update your .js file to go update the calling page (which
might be just as simple too)

Yahoo discourages ETags as well depending on your usage model:

“If you’re not taking advantage of the flexible validation model that
ETags provide, it’s better to just remove the ETag altogether. The
Last-Modified header validates based on the component’s timestamp. And
removing the ETag reduces the size of the HTTP headers in both the
response and subsequent requests.”[1]

[1] http://developer.yahoo.com/performance/rules.html


#4

Anton Y. wrote:

In general Etag for static files is not better than Last-Modified header.

Etag is useful for dynamic content, when modify time is not known. In
this case Etage can be generated from hash (md5/sha) of content.

Can this work with the memcached module in any way? For instance, if the
resource requested is in the memcached store then the 304 header is
sent?

Phillip B Oldham
The Activity People
removed_email_address@domain.invalid mailto:removed_email_address@domain.invalid


Policies

This e-mail and its attachments are intended for the above named
recipient(s) only and may be confidential. If they have come to you in
error, please reply to this e-mail and highlight the error. No action
should be taken regarding content, nor must you copy or show them to
anyone.

This e-mail has been created in the knowledge that Internet e-mail is
not a 100% secure communications medium, and we have taken steps to
ensure that this e-mail and attachments are free from any virus. We must
advise that in keeping with good computing practice the recipient should
ensure they are completely virus free, and that you understand and
observe the lack of security when e-mailing us.


#5

Phillip B Oldham wrote:

In general Etag for static files is not better than Last-Modified header.

Etag is useful for dynamic content, when modify time is not known. In
this case Etage can be generated from hash (md5/sha) of content.

Can this work with the memcached module in any way? For instance, if the
resource requested is in the memcached store then the 304 header is sent?

AFAIK it is not possible now.


#6

Thanks a lot for Michael and Anton’s replies and good suggestion!

On Tue, Apr 14, 2009 at 11:36 PM, Michael S. removed_email_address@domain.invalid
wrote:

short expires time like, expires 1h, to renew the client cache as soon

purge the cache constantly.

“If you’re not taking advantage of the flexible validation model that
ETags provide, it’s better to just remove the ETag altogether. The
Last-Modified header validates based on the component’s timestamp. And
removing the ETag reduces the size of the HTTP headers in both the
response and subsequent requests.”[1]

[1] http://developer.yahoo.com/performance/rules.html


e$B2F@6A3e(B
Xia Q.
removed_email_address@domain.invalid

Henny Youngman - "I told the doctor I broke my leg in two
places. He told me to quit going to those places." -
http://www.brainyquote.com/quotes/authors/h/henny_youngman.html