I solved a very strange bug today where mod_cache kept returning a particular cached file for seemingly every URL on a site.
After using LogLevel debug
, I finally realized that mod_cache does not store content by the request URL, but rather by the final URL after RewriteRules have been processed.
This PHP application was using a common RewriteRule to map most requests to a single script, but the full request URL was not being copied into the rewritten URL (the script was just relying on $_SERVER['REQUEST_URI']
to route the request). The result is mod_cache considered all URLs the same, and it was only by some magic of session cache-busting headers that the app managed to function at all. Internally mod_cache was just churning that single cache file over and over.
The simple fix was to make sure the full URL path ended up in the internal URL:
RewriteRule ^(.*)$ index.php/$1 [L,QSA]