aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxim Dounin <mdounin@mdounin.ru>2012-07-09 14:53:42 +0000
committerMaxim Dounin <mdounin@mdounin.ru>2012-07-09 14:53:42 +0000
commit1b77858ac56ed4c304d7265f0691772f30e8dccb (patch)
tree1287ce0eb6ff25874bf85729115f3f2c44d8dd09 /src
parenteb7c38a49ae11d9084969790f0b86d75cc1f11c7 (diff)
downloadnginx-1b77858ac56ed4c304d7265f0691772f30e8dccb.tar.gz
nginx-1b77858ac56ed4c304d7265f0691772f30e8dccb.zip
Entity tags: the "etag" directive.
It allows to disable generation of nginx's own entity tags, while still handling ETags in cache properly. This may be useful e.g. if one want to serve static files from servers with different ETag generation algorithms.
Diffstat (limited to 'src')
-rw-r--r--src/http/ngx_http_core_module.c18
-rw-r--r--src/http/ngx_http_core_module.h1
2 files changed, 18 insertions, 1 deletions
diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c
index ebc9f7413..a8177aef7 100644
--- a/src/http/ngx_http_core_module.c
+++ b/src/http/ngx_http_core_module.c
@@ -650,6 +650,13 @@ static ngx_command_t ngx_http_core_commands[] = {
offsetof(ngx_http_core_loc_conf_t, chunked_transfer_encoding),
NULL },
+ { ngx_string("etag"),
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
+ ngx_conf_set_flag_slot,
+ NGX_HTTP_LOC_CONF_OFFSET,
+ offsetof(ngx_http_core_loc_conf_t, etag),
+ NULL },
+
{ ngx_string("error_page"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
|NGX_CONF_2MORE,
@@ -1811,7 +1818,14 @@ ngx_http_set_exten(ngx_http_request_t *r)
ngx_int_t
ngx_http_set_etag(ngx_http_request_t *r)
{
- ngx_table_elt_t *etag;
+ ngx_table_elt_t *etag;
+ ngx_http_core_loc_conf_t *clcf;
+
+ clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
+
+ if (!clcf->etag) {
+ return NGX_OK;
+ }
etag = ngx_list_push(&r->headers_out.headers);
if (etag == NULL) {
@@ -3539,6 +3553,7 @@ ngx_http_core_create_loc_conf(ngx_conf_t *cf)
clcf->recursive_error_pages = NGX_CONF_UNSET;
clcf->server_tokens = NGX_CONF_UNSET;
clcf->chunked_transfer_encoding = NGX_CONF_UNSET;
+ clcf->etag = NGX_CONF_UNSET;
clcf->types_hash_max_size = NGX_CONF_UNSET_UINT;
clcf->types_hash_bucket_size = NGX_CONF_UNSET_UINT;
@@ -3800,6 +3815,7 @@ ngx_http_core_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
ngx_conf_merge_value(conf->server_tokens, prev->server_tokens, 1);
ngx_conf_merge_value(conf->chunked_transfer_encoding,
prev->chunked_transfer_encoding, 1);
+ ngx_conf_merge_value(conf->etag, prev->etag, 1);
ngx_conf_merge_ptr_value(conf->open_file_cache,
prev->open_file_cache, NULL);
diff --git a/src/http/ngx_http_core_module.h b/src/http/ngx_http_core_module.h
index 52b3dde3c..b11bdcd90 100644
--- a/src/http/ngx_http_core_module.h
+++ b/src/http/ngx_http_core_module.h
@@ -392,6 +392,7 @@ struct ngx_http_core_loc_conf_s {
ngx_flag_t recursive_error_pages; /* recursive_error_pages */
ngx_flag_t server_tokens; /* server_tokens */
ngx_flag_t chunked_transfer_encoding; /* chunked_transfer_encoding */
+ ngx_flag_t etag; /* etag */
#if (NGX_HTTP_GZIP)
ngx_flag_t gzip_vary; /* gzip_vary */