Changes with Apache 2.3.0
[Remove entries to the current 2.0 and 2.2 section below, when backported]
+ *) mod_cache: Add CacheIgnoreQueryString directive. PR 41484.
+ [Fredrik Widlund <fredrik.widlund qbrick.com>]
+
*) mod_dbd: Introduce configuration groups to allow inheritance by virtual
hosts of database configurations from the main server. Determine the
minimal set of distinct configurations and share connection pools
<seealso><directive module="mod_cache">CacheStoreNoStore</directive></seealso>
</directivesynopsis>
+<directivesynopsis>
+<name>CacheIgnoreQueryString</name>
+<description>Ignore query string when caching</description>
+<syntax>CacheIgnoreQueryString On|Off</syntax>
+<default>CacheIgnoreQueryString Off</default>
+<contextlist><context>server config</context><context>virtual host</context>
+</contextlist>
+
+<usage>
+ <p>Ordinarily, requests with query string parameters are cached separately
+ for each unique query string. This is according to RFC 2616/13.9 done only
+ if an expiration time is specified. The
+ <directive>CacheIgnoreQueryString</directive> directive tells the cache to
+ cache requests even if no expiration time is specified, and to reply with
+ a cached reply even if the query string differs. From a caching point of
+ view the request is treated as if having no query string when this
+ directive is enabled.</p>
+
+ <example>
+ CacheIgnoreQueryString On
+ </example>
+
+</usage>
+</directivesynopsis>
+
<directivesynopsis>
<name>CacheLastModifiedFactor</name>
<description>The factor used to compute an expiry date based on the
apr_status_t cache_generate_key_default(request_rec *r, apr_pool_t* p,
char**key)
{
+ cache_server_conf *conf;
char *port_str, *hn, *lcs;
const char *hostname, *scheme;
int i;
+ /*
+ * Get the module configuration. We need this for the CacheIgnoreQueryString
+ * option below.
+ */
+ conf = (cache_server_conf *) ap_get_module_config(r->server->module_config,
+ &cache_module);
+
/*
* Use the canonical name to improve cache hit rate, but only if this is
* not a proxy request or if this is a reverse proxy request.
port_str = apr_psprintf(p, ":%u", ap_get_server_port(r));
}
- /* Key format is a URI */
- *key = apr_pstrcat(p, scheme, "://", hostname, port_str,
- r->parsed_uri.path, "?", r->parsed_uri.query, NULL);
+ /* Key format is a URI, optionally without the query-string */
+ if (conf->ignorequerystring) {
+ *key = apr_pstrcat(p, scheme, "://", hostname, port_str,
+ r->parsed_uri.path, "?", NULL);
+ }
+ else {
+ *key = apr_pstrcat(p, scheme, "://", hostname, port_str,
+ r->parsed_uri.path, "?", r->parsed_uri.query, NULL);
+ }
return APR_SUCCESS;
}
/* if a Expires header is in the past, don't cache it */
reason = "Expires header already expired, not cacheable";
}
- else if (r->parsed_uri.query && exps == NULL) {
+ else if (!conf->ignorequerystring && r->parsed_uri.query && exps == NULL) {
/* if query string present but no expiration time, don't cache it
* (RFC 2616/13.9)
*/
/* array of headers that should not be stored in cache */
ps->ignore_headers = apr_array_make(p, 10, sizeof(char *));
ps->ignore_headers_set = CACHE_IGNORE_HEADERS_UNSET;
+ /* flag indicating that query-string should be ignored when caching */
+ ps->ignorequerystring = 0;
+ ps->ignorequerystring_set = 0;
return ps;
}
(overrides->ignore_headers_set == CACHE_IGNORE_HEADERS_UNSET)
? base->ignore_headers
: overrides->ignore_headers;
+ ps->ignorequerystring =
+ (overrides->ignorequerystring_set == 0)
+ ? base->ignorequerystring
+ : overrides->ignorequerystring;
return ps;
}
static const char *set_cache_ignore_no_last_mod(cmd_parms *parms, void *dummy,
return NULL;
}
+static const char *set_cache_ignore_querystring(cmd_parms *parms, void *dummy,
+ int flag)
+{
+ cache_server_conf *conf;
+
+ conf =
+ (cache_server_conf *)ap_get_module_config(parms->server->module_config,
+ &cache_module);
+ conf->ignorequerystring = flag;
+ conf->ignorequerystring_set = 1;
+ return NULL;
+}
+
static int cache_post_config(apr_pool_t *p, apr_pool_t *plog,
apr_pool_t *ptemp, server_rec *s)
{
AP_INIT_ITERATE("CacheIgnoreHeaders", add_ignore_header, NULL, RSRC_CONF,
"A space separated list of headers that should not be "
"stored by the cache"),
+ AP_INIT_FLAG("CacheIgnoreQueryString", set_cache_ignore_querystring,
+ NULL, RSRC_CONF,
+ "Ignore query-string when caching"),
AP_INIT_TAKE1("CacheLastModifiedFactor", set_cache_factor, NULL, RSRC_CONF,
"The factor used to estimate Expires date from "
"LastModified date"),
/* Minimum time to keep cached files in msecs */
apr_time_t minex;
int minex_set;
+ /** ignore query-string when caching */
+ int ignorequerystring;
+ int ignorequerystring_set;
} cache_server_conf;
/* cache info information */