summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuediger Pluem <rpluem@apache.org>2007-05-17 20:57:17 +0000
committerRuediger Pluem <rpluem@apache.org>2007-05-17 20:57:17 +0000
commit3fd2406cd0dd7a834cde5a3f9e7f5c0064287aea (patch)
tree99d64ddabc79cfb06ca03b3a90a71bc054eb6022
parent4aee2e0b74a25bd3b0035d83af3b37bdf596b811 (diff)
downloadhttpd-3fd2406cd0dd7a834cde5a3f9e7f5c0064287aea.tar.gz
Merge r504183 from trunk:
* Add CacheIgnoreQueryString directive to cache requests with a query string even if no expiration time is specified. Futhermore the query string will not be used for key generation such that requests to the same URI path, but with different query strings are mapped to the same cache entity. Turning this setting to ON violates RFC 2616/13.9 and thus it is turned off by default. PR: 41484 Submitted by: Fredrik Widlund <fredrik.widlund qbrick.com> Reviewed by: rpluem, jerenkrantz, jim git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x@539111 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--CHANGES3
-rw-r--r--STATUS9
-rw-r--r--docs/manual/mod/mod_cache.xml25
-rw-r--r--modules/cache/cache_storage.c20
-rw-r--r--modules/cache/mod_cache.c25
-rw-r--r--modules/cache/mod_cache.h3
6 files changed, 72 insertions, 13 deletions
diff --git a/CHANGES b/CHANGES
index bd0bf756c4..5f1e684318 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,9 @@
-*- coding: utf-8 -*-
Changes with Apache 2.2.5
+ *) mod_cache: Add CacheIgnoreQueryString directive. PR 41484.
+ [Fredrik Widlund <fredrik.widlund qbrick.com>]
+
*) mod_cache: While serving a cached entity ensure that filters that have
been applied to this cached entity before saving it to the cache are not
applied again. PR 40090. [Ruediger Pluem]
diff --git a/STATUS b/STATUS
index d64a275c63..9a6b2bc829 100644
--- a/STATUS
+++ b/STATUS
@@ -129,15 +129,6 @@ PATCHES ACCEPTED TO BACKPORT FROM TRUNK:
cache during the quick handler phase. If there are still questions
we should continue the discussion on the list.
- * mod_cache: Add CacheIgnoreQueryString directive to cache requests with
- a query string even if no expiration time is specified.
- PR: 41484
- Trunk version of patch:
- http://svn.apache.org/viewvc?view=rev&revision=504183
- 2.2.x version of patch:
- Trunk version works
- +1: rpluem, jerenkrantz, jim
-
PATCHES PROPOSED TO BACKPORT FROM TRUNK:
* ApacheMonitor: Fix Windows Vista detection.
diff --git a/docs/manual/mod/mod_cache.xml b/docs/manual/mod/mod_cache.xml
index 9a4d4a5f04..b98b9b1fa9 100644
--- a/docs/manual/mod/mod_cache.xml
+++ b/docs/manual/mod/mod_cache.xml
@@ -292,6 +292,31 @@ header.</description>
</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
LastModified date.</description>
diff --git a/modules/cache/cache_storage.c b/modules/cache/cache_storage.c
index 460fa3dfd6..f396ce8d3a 100644
--- a/modules/cache/cache_storage.c
+++ b/modules/cache/cache_storage.c
@@ -331,11 +331,19 @@ int cache_select(request_rec *r)
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.
* We need to handle both cases in the same manner as for the reverse proxy
@@ -425,9 +433,15 @@ apr_status_t cache_generate_key_default(request_rec *r, apr_pool_t* p,
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;
}
diff --git a/modules/cache/mod_cache.c b/modules/cache/mod_cache.c
index ffee10675d..9646b964da 100644
--- a/modules/cache/mod_cache.c
+++ b/modules/cache/mod_cache.c
@@ -452,7 +452,7 @@ static int cache_save_filter(ap_filter_t *f, apr_bucket_brigade *in)
/* 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)
*/
@@ -915,6 +915,9 @@ static void * create_cache_config(apr_pool_t *p, server_rec *s)
/* 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;
}
@@ -960,6 +963,10 @@ static void * merge_cache_config(apr_pool_t *p, void *basev, void *overridesv)
(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,
@@ -1138,6 +1145,19 @@ static const char *set_cache_factor(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)
{
@@ -1187,6 +1207,9 @@ static const command_rec cache_cmds[] =
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"),
diff --git a/modules/cache/mod_cache.h b/modules/cache/mod_cache.h
index eb5c8cede7..308a70ab77 100644
--- a/modules/cache/mod_cache.h
+++ b/modules/cache/mod_cache.h
@@ -150,6 +150,9 @@ typedef struct {
#define CACHE_IGNORE_HEADERS_SET 1
#define CACHE_IGNORE_HEADERS_UNSET 0
int ignore_headers_set;
+ /** ignore query-string when caching */
+ int ignorequerystring;
+ int ignorequerystring_set;
} cache_server_conf;
/* cache info information */