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
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.
On Wed, Feb 22, 2012 at 05:05:32PM +0100, Simone F. 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.