Hi there,

i am trying to configure squid for the following use-case:

We are using squid as a reverse-proxy cache to speed up our website. A large 
area of the website is public. But there is also a personalized area. If a user 
logs into his personal site, we maintain a session for the user (using standard 
tomcat features jsession-id cookie with optional url-rewriting).

I can easily tell the private and public area apart by examining the URL. So no 
problem to configure caching for the private area. 

However the pages on the public area has a small caveat: If the user was logged 
in the private area, we maintain the "logged-in" state and reflect that state 
on public pages also (outputting "Welcome John Doe" in a small box).
Of course we must not cache these pages.

  # Recognizes mysite
  acl MYSITE url_regex ^http://[^.]*\.mysite\.de

  # Don't cache pages, if user sends or gets a cookie
  acl JSESSIONID1 req_header Cookie -i  jsessionid
  cache deny MYSITE JSESSIONID1

  acl JSESSIONID2 rep_header Set-Cookie -i jsessionid
  cache deny  MYSITE JSESSIONID2


This seemed to wor fine. Until i did a jmeter test, mixing Requests with and 
without sessionid cookies. Is seems that if i request an already cached url 
with a session-cookie, that the cached document is flushed. This is correct 
from a security-point-of-view: We are not leaking any private data. But a 
subsequent request without cookie to the very same URL will report a cache-miss 
(regarding the response-headers). Which is not so good for performance.  The 
hit rate degrades with the number of requests with cookies.


Next idea was to use "always_direct allow" instead of "cache deny" for private 
access on public pages. My understanding was, that squid bypasses all other 
internal processing:

  # Recognizes mysite
  acl MYSITE url_regex ^http://[^.]*\.mysite\.de

  # Don't cache pages, if user sends or gets a cookie
  acl JSESSIONID1 req_header Cookie -i  jsessionid
  alway_direct allow MYSITE JSESSIONID1

  acl JSESSIONID2 rep_header Set-Cookie -i jsessionid
  alway_direct allow MYSITE JSESSIONID2


Big surprise: Even requests without cookie are alway cache-misses. Ok. There is 
no explicit "cache allow" rule. But there wasn't any in the former example as 
well. So what did happen? Anyway i added an explicit rule at the end, hoping it 
would be used, if all "always_direct" rules where evaluated to "false":

  cache allow MYSITE

Even bigger surprise:

Now the requests containing a session-cookie are also served from the cache 
(indicated by a Cache-Hit header, and lacking the "Welcome" box). Which is not 
acceptable, because we might leak private data.

One last effort (now poking in the dark) adding both directives:

  alway_direct allow MYSITE JSESSIONID1
  cache deny MYSITE JSESSIONID1

Now the result is like in the very first configuration. Like allow_direct 
wasn't used at all.

Please can anyone help? Is my problem solvable at all? Can someone shed some 
light on what "always_direct" is meant for (i have read something about 
cache-hierarchies...)?

Regards 


achim





Reply via email to