Honoring ETag of cached content
Marc Aymerich
glicerinu at gmail.com
Sat Nov 2 14:56:37 UTC 2013
On Sat, Nov 2, 2013 at 1:10 PM, Maxim Dounin <mdounin at mdounin.ru> wrote:
> Hello!
>
> On Sat, Nov 02, 2013 at 02:55:09AM +0100, Marc Aymerich wrote:
>
> > On Sat, Nov 2, 2013 at 12:16 AM, Maxim Dounin <mdounin at mdounin.ru>
> wrote:
> >
> > > Hello!
> > >
> > > On Fri, Nov 01, 2013 at 10:29:06PM +0100, Marc Aymerich wrote:
> > >
> > > > Hi,
> > > > I'm using nginx proxy pass to cache content of our dynamic web
> > > application.
> > > >
> > > > In order to save some bandwidth our client application uses
> conditional
> > > > requests based on ETag. However nginx ignores the ETag of cached
> pages :(
> > > >
> > > > What would be required if I want to honor the ETag of cached pages?
> Is
> > > > something that can be achieve by means of configuration? or I would
> need
> > > to
> > > > write an nginx module in C?
> > >
> > > It is expected to just work in 1.3.3+. If you don't see it
> > > working, you may want to check the version you are running.
> >
> >
> > Hi maxim,
> > yeap I'm running 1.4.1 but I never get a 304 :(
> > This is what a response from cache looks like
> >
> > # wget --no-check https://[fdf5:5351:1dfd:0:0:0:0:2]/api/ -S --header
> > 'If-None-Match: "83393a3900e4abce27212d7a27cae589"' -q
> > HTTP/1.1 200 OK
> > Server: nginx/1.4.1
> > Date: Sat, 02 Nov 2013 01:40:24 GMT
> > Content-Type: application/json
> > Transfer-Encoding: chunked
> > Connection: keep-alive
> > ETag: "83393a3900e4abce27212d7a27cae589"
> > Allow: GET, HEAD, OPTIONS
> > Vary: Accept, Cookie, Accept-Encoding
> > Expires: Sat, 02 Nov 2013 01:41:24 GMT
> > Cache-Control: max-age=60
>
> [...]
>
> > Notice the etag value from cached content is different from the fresh
> one,
> > even though the content is exactly the same, I presume this is nginx
> doing
> > its job of updating the ETag for some differences because of caching, but
> > still fails to reply a conditional request properly :(
>
> Ok, I see what goes on here. Condintional requests (even ones
> using ETag in If-None-Match) are only handled by nginx if there is
> Last-Modified response date set, and it's not set in your backend
> responses.
>
> This needs to be addressed, If-None-Match / If-Match handling from
> cache shouldn't require Last-Modified being present in a cached
> response. Meanwhile, you may add some Last-Modified to your
> backend responses as a workaround.
>
Wowo that's it :)
# wget --no-check https://[fdf5:5351:1dfd:0:0:0:0:2]/api/ -S --header
'If-None-Match: "83393a3900e4abce27212d7a27cae589"' -q
HTTP/1.1 304 Not Modified
Server: nginx/1.4.1
Date: Sat, 02 Nov 2013 14:53:29 GMT
Connection: keep-alive
Vary: Accept, Cookie, Accept-Encoding
Last-Modified: Sat, 02 Nov 2013 14:53:29 GMT
ETag: "83393a3900e4abce27212d7a27cae589"
Allow: GET, HEAD, OPTIONS
Expires: Sat, 02 Nov 2013 14:54:29 GMT
Cache-Control: max-age=60
Thank you very much for your help maxim!
Shall I report this to nginx bug tracker?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.nginx.org/pipermail/nginx/attachments/20131102/1c2a984b/attachment.html>
More information about the nginx
mailing list