YSlow: Yahoo's Problems Are Not Your Problems

ETags aren’t necessarily checksums. You can put any kind of value in them, like an ID, a cryptographic hash (eg: MD5 or SHA-1), an actual datetime like the modified timestamp in your database table, the file size or a compound value of the above or anything else.

What is important when using ETag is that you will generate the same ETag value for unmodified resources and a different ETag if they’ve been modified.

As for the Expires, I can’t confirm at the moment but I believe that the “must-revalidate” property of the Cache-Control will force the browser to check with the server despite the presence of the Expires header.

I prefer to use the max-age property of the Cache-Control rather than Expires. It is simpler to just say “max-age=86400” then “Expires: Fri, 18 Aug 2007 02:55:13 GMT”