Forum: NGINX Order of HTTP headers change cache behaviour

D5be57e188137d0f18911a911a0b63b2?d=identicon&s=25 Simone Fumagalli (Guest)
on 2012-02-22 17:06
(Received via mailing list)
Hello.

Looking at my log I've noticed that some pages were not cached. After a
bit of debugging I've noticed that the order in which the HTTP header
are returned from Apache change how NGINX this save the page in the
cache

So a page with this code is *NOT* cached

<?php

header('Content-Type: text/html; charset=UTF-8');
header('Last-Modified: Wed, 22 Feb 2012 14:44:11 GMT');
header('Expires: Wed, 11 Jan 1984 05:00:00 GMT');
header("X-Accel-Expires: 600");
header('Cache-Control: no-cache, must-revalidate, max-age=0');
header('Pragma: no-cache');

Echo "Hello World !";

?>

if I comment/delete the line header('Expires: Wed, 11 Jan 1984 05:00:00
GMT'); the page is cached.

Even if I move header("X-Accel-Expires: 600") before header('Expires:
Wed, 11 Jan 1984 05:00:00 GMT'); the page is cached
Same thing happen for the header Cache-Control. If is before
X-Accel-Expires the page is not cached if is after it is !

The conf for NGINX is very standard and proxy_cache_valid is not
specified.

Is this correct ? Where am I wrong ?

Thanks

--
Simone
A8108a0961c6087c43cda32c8616dcba?d=identicon&s=25 Maxim Dounin (Guest)
on 2012-02-22 17:28
(Received via mailing list)
Hello!

On Wed, Feb 22, 2012 at 05:05:32PM +0100, Simone Fumagalli wrote:

> header('Expires: Wed, 11 Jan 1984 05:00:00 GMT');
> Even if I move header("X-Accel-Expires: 600") before header('Expires: Wed, 11
Jan 1984 05:00:00 GMT'); the page is cached
> Same thing happen for the header Cache-Control. If is before X-Accel-Expires the
page is not cached if is after it is !
>
> The conf for NGINX is very standard and proxy_cache_valid is not specified.
>
> Is this correct ? Where am I wrong ?

This probably should be counted as a bug (or at least
misfeature).

Here are what happens: if the Expires header comes first, it
disables caching due to being set to date in the past.  The
X-Accel-Expires header which comes later can't re-enable caching.

On the other hand, if X-Accel-Expires comes first, it will set
cache expiration time.  The Expires and Cache-Control headers
later will be just ignored as cache expiration time is already
set.

As a workaround you may want to always sent X-Accel-Expires first,
or explicitly ignore other headers with proxy_ignore_headers.

Maxim Dounin
D5be57e188137d0f18911a911a0b63b2?d=identicon&s=25 Simone Fumagalli (Guest)
on 2012-02-22 17:39
(Received via mailing list)
On 02/22/2012 05:28 PM, Maxim Dounin wrote:
> This probably should be counted as a bug (or at least misfeature).

Ciao, do you think you will fix/change this behaviour ?
Just to know if and how change my configurations

thanks

--
Simone
A8108a0961c6087c43cda32c8616dcba?d=identicon&s=25 Maxim Dounin (Guest)
on 2012-02-22 18:04
(Received via mailing list)
Hello!

On Wed, Feb 22, 2012 at 05:39:22PM +0100, Simone Fumagalli wrote:

> On 02/22/2012 05:28 PM, Maxim Dounin wrote:
> > This probably should be counted as a bug (or at least misfeature).
>
> Ciao, do you think you will fix/change this behaviour ?
> Just to know if and how change my configurations

Eventually this will be fixed, but there are no immediate plans
to and it's relatively low priority.

Maxim Dounin
Please log in before posting. Registration is free and takes only a minute.
Existing account

NEW: Do you have a Google/GoogleMail, Yahoo or Facebook account? No registration required!
Log in with Google account | Log in with Yahoo account | Log in with Facebook account
No account? Register here.