You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@httpd.apache.org by SpliFF <sp...@warriorhut.org> on 2011/05/02 06:46:51 UTC

[users@httpd] Need help with tricky mod_cache configuration

I'm trying to configure mod_cache in Apache 2.2.17 to act as a transparent cache for an application server but I have
some special requirements whose overall purpose is to cache "public" access but bypass the cache when users are logged
in. I'm setting a cookie "NOCACHE=on" when the user logs in and checking for that cookie in Apache. For this to work
clients must always revalidate with the cache (to send the cookies).

My requirements are:

* Clients should always revalidate with the cache but NOT the application server unless a special cookie is set.
* If a page is in the Apache cache the cache should send 304, not the whole page.
* If user shift-refreshes the browser always revalidate with the application server.
* I can't use alternate domains, ssl or special paths or query strings for logged-in users because my application isn't
designed that way.

I'm been experimenting with different headers and cache options but so far I haven't found a solution that satisfies all
the requirements. Generally when I get one thing to work another breaks eg:

* The HTTP spec solution of using vary: Set-Cookie won't work because the application sets session cookies and you can't
pick one cookie out of the string.
* Using 'CacheIgnoreCacheControl on' allows the cache to work with no-cache headers but prevents shift-refresh from
hitting the application server.
* Setting max-age=0 or no-cache in headers with  'CacheIgnoreCacheControl off' causes the page to not cache in Apache at
all.
* Setting no-store with 'CacheStoreNoStore On' is pretty close but since the client wont store the page the cache is
sending the whole response body every time (not 304).

My vhost config:

====================
    # Expiry and cache-control

    # Set expires header
    ExpiresActive On
    ExpiresDefault "access plus 1 days"
    #ExpiresByType text/html "now"

    # Check for NOCACHE cookie sent by logged-in users and bypass the cache
    SetEnvIf Cookie "NOCACHE" no-cache
    Header set Cache-Control "no-cache" env=no-cache

    # Force all requests to re-validate so cookies are sent even when the browser has cached the page
    Header append Cache-Control "must-revalidate"

    # Don't cache cookie headers
    CacheIgnoreHeaders Set-Cookie

    # Enable disk cache
    CacheEnable disk /
    CacheDisable /images
    CacheDisable /styles
    CacheDisable /scripts
    CacheDisable /base
    CacheDisable /users
    CacheDisable /admin
    CacheRoot /var/cache/apache2

    # Various attempts to treat this cache differently to downstream caches
    #CacheStoreNoStore On
    #CacheIgnoreCacheControl on
    #CacheIgnoreNoLastMod On

    # Forward uncached requests to the application server
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !/[^/:]+\.[^/:]{2,5}$
    RewriteRule (.*) /index.cfm$1 [PT,L]
====================

Final thing, the Apache docs seem to use CacheStoreNo*Store* and CacheStoreNo*Cache* interchangeably. Is this an alias
or a typo? Which is correct?

---------------------------------------------------------------------
The official User-To-User support forum of the Apache HTTP Server Project.
See <URL:http://httpd.apache.org/userslist.html> for more info.
To unsubscribe, e-mail: users-unsubscribe@httpd.apache.org
   "   from the digest: users-digest-unsubscribe@httpd.apache.org
For additional commands, e-mail: users-help@httpd.apache.org