- Introduction
- The Apache Request Object
- The HTTP Request Message
- The Client Request
- Accessing Client Request Headers
- Accessing HTML Form Fields
- Reading POSTed Data Manually
- Manipulating Cookies
- Handling File Uploads
- Setting Server Response Headers
- Controlling Caching Behavior
- Sending Server Response Headers
- Setting the Response Status
- Setting Error Headers
- Manipulating Headers with Multiple Like Fields
- Using Subrequests
- Setting Headers for Subrequests
- Short-Circuiting Subrequests
- Getting or Setting the Request Method
- Accessing the Request Object from XS
Controlling Caching Behavior
You want to make sure that dynamic documents are not cached by clients or proxy servers.
Technique
Use the no_cache() method from the Apache class, passing it in a single true value.
# Turn off cache headers for the current request. $r->no_cache(1);
Comments
When creating a wholly dynamic document, chances are that you do not want either the client or any in-between proxies caching the content you are about to generate. The no_cache flag in the Apache request record is used to control whether Apache will automatically send an Expires header formatted with the time of the request (according to the server, not the client). mod_perl provides the no_cache() method which, besides getting or setting the no_cache flag, offers control of the Pragma and Cache-Control headers as well. When called with a single true argument, no_cache() will set the Pragma and Cache-Control response headers to the string no-cache. The combination of all these headers should be sufficient to ensure that the content you send will be considered fresh by the majority of (compliant) browsers.
Calling no_cache(0) will keep Apache from sending the Expires header, and remove the Pragma and Cache-Control headers from the response header table. Because the Pragma header can be used by either the client or server to implement any custom behavior and not just caching, this particular feature may have unforeseen consequences.
An important aspect of the HTTP protocol is that, regardless of the status of the Expires, Pragma, or Cache-Control headers, clients and proxies should not be caching anything other than a successful response. Thus, it is not necessary to set no_cache(1) for all dynamic documents, just those that are generating actual content, and not those that will return a redirect or error response.
Although setting no_cache(1) is a quick and convenient solution to the problem of stale content, if you really gave your application some thought, you would probably find that the content you generate does not really have the ability to change on every request. In fact, your underlying data may only change once a day, or not for weeks. In these cases, you would benefit greatly from using cache-related headers properly, as described in Recipe 6.6.