filter out headers for fastcgi cache
Max
nginxyz at mail.ru
Fri Feb 10 22:54:42 UTC 2012
10 февраля 2012, 03:39 от Michael McCallister <mikemc-nginx at terabytemedia.com>:
> Greetings,
>
> I would like to propose that an additional feature for nginx be
> considered related to fastcgi caching: the ability to specify headers
> that will not be stored in cache, but will be sent to the client when
> the cached version is created (sent to the client responsible for
> creating the cached copy). If some solution already exists providing
> this functionality, my apologies, I was not able to track one down -
> currently assuming one does not exist.
>
> Here is one scenario where such an option would be useful (I am sure
> there are others):
>
> A typical scenario where fastcgi caching can be employed for performance
> benefits is when the default version of a page is loaded. By "default",
> I mean the client has no prior session data which might result in unique
> session specific request elements. In the case of PHP, the presence of
> session data is typically determined by checking for the presence of a
> "PHPSESSID" cookie. So if this cookie does not exist, then it can be
> assumed there is no session - an optimal time to create a cached version
> of the page in many scenarios. However, many PHP apps/sites/etc. also
> create a session in the event one does not exist (a behavior I assume is
> not specific to PHP) - meaning the the response typically contains a
> Set-Cookie: PHPSESSID.... header. Nginx's default behavior is not to
> cache any page with a Set-Cookie header, and that makes sense as a
> default - but lets assume for this example that fastcgi_ignore_headers
> Set-Cookie; is in effect and the cached version of the default version
> of the page gets created. The problem here is that the cached version
> created also has the Set-Cookie header cached as well - which causes
> problems for obvious reasons (hands out the same session ID/cookie for
> all users). Ideally, we could specify to cache everything except the
> specified headers - Set-Cookie in this example.
>
> Am I the only one who would find this option useful or are there others?
>
> If this would be found to be useful by others and there is consensus
> that such an addition is called for by those with the resources to
> implement it, I am not sure if it makes sense to strip the headers prior
> storage in cache or when reading from cache - probably whichever is easier.
>
> Thoughts?
http://wiki.nginx.org/NginxHttpProxyModule#proxy_hide_header
The proxy_hide_header directive does exactly what you described,
the cookies get stored in the cache, but they are not passed back
to the client, so this is all you'd need:
# Cache responses containing the Set-Cookie header as well
fastcgi_ignore_headers Set-Cookie;
# Strip the Set-Cookie header from cached content
# when passing cached content back to clients
proxy_hide_header Set-Cookie;
You could also include session cookies in the fastcgi_cache_key
to make sure new users get the default cached content, while
everyone else gets their session-specific cached content:
fastcgi_cache_key "$cookie_PHPSESSID$scheme$request_method$host$server_port$request_uri";
Max
More information about the nginx
mailing list