Opened 4 years ago
Closed 4 years ago
#2309 closed defect (duplicate)
Prioritize `X-Accel-Expires` even if specific Cache-Control flags
| Reported by: | Owned by: | ||
|---|---|---|---|
| Priority: | minor | Milestone: | |
| Component: | nginx-core | Version: | |
| Keywords: | Cc: | ||
| uname -a: | Darwin horieyuugonoMacBook.local 20.6.0 Darwin Kernel Version 20.6.0: Tue Oct 12 18:33:42 PDT 2021; root:xnu-7195.141.8~1/RELEASE_X86_64 x86_64 | ||
| nginx -V: |
nginx version: nginx/1.21.5
built by clang 12.0.5 (clang-1205.0.22.11) configure arguments: |
||
Description (last modified by )
We also have written the same issue in nginx forum.
https://forum.nginx.org/read.php?2,219520,293374#msg-293374
it seems not to override entirely Cache-Control by X-Accel-Expires. And It has differential behavor according to order of upstream header.
We introduced the new flag in upstream.h to identify whether the specific Cache-Control flags (such as no-store, no-cache, private, stale-while-revalidate, stale-if-error) has already processed before upstream_process_accel_expires, and state of u-> cacheable is also not change unnecessarily.
diff --git a/src/http/ngx_http_upstream.c b/src/http/ngx_http_upstream.c
index ded833c..5605e28 100644
--- a/src/http/ngx_http_upstream.c
+++ b/src/http/ngx_http_upstream.c
@@ -4747,6 +4747,7 @@ ngx_http_upstream_process_cache_control(ngx_http_request_t *r,
|| ngx_strlcasestrn(start, last, (u_char *) "private", 7 - 1) != NULL)
{
u->cacheable = 0;
+ u->prior_accel_expire = 1;
return NGX_OK;
}
@@ -4772,6 +4773,7 @@ ngx_http_upstream_process_cache_control(ngx_http_request_t *r,
}
u->cacheable = 0;
+ u->prior_accel_expire = 1;
return NGX_OK;
}
@@ -4800,6 +4802,7 @@ ngx_http_upstream_process_cache_control(ngx_http_request_t *r,
}
u->cacheable = 0;
+ u->prior_accel_expire = 1;
return NGX_OK;
}
@@ -4823,6 +4826,7 @@ ngx_http_upstream_process_cache_control(ngx_http_request_t *r,
}
u->cacheable = 0;
+ u->prior_accel_expire = 1;
return NGX_OK;
}
@@ -4897,6 +4901,10 @@ ngx_http_upstream_process_accel_expires(ngx_http_request_t *r,
if (r->cache == NULL) {
return NGX_OK;
}
+ if (u->prior_accel_expire) {
+ u->prior_accel_expire = 0;
+ u->cacheable = 1;
+ }
len = h->value.len;
p = h->value.data;
diff --git a/src/http/ngx_http_upstream.h b/src/http/ngx_http_upstream.h
index 3db7b06..59710c1 100644
--- a/src/http/ngx_http_upstream.h
+++ b/src/http/ngx_http_upstream.h
@@ -386,6 +386,7 @@ struct ngx_http_upstream_s {
unsigned store:1;
unsigned cacheable:1;
+ unsigned prior_accel_expire:1;
unsigned accel:1;
unsigned ssl:1;
#if (NGX_HTTP_CACHE)
if you wanna be not to introduce new flag, we also prepare another patch for this to change .
@@ -4904,18 +4912,15 @@ ngx_http_upstream_process_accel_expires(ngx_http_request_t *r,
if (p[0] != '@') {
n = ngx_atoi(p, len);
- switch (n) {
- case 0:
+ if (n == 0) {
u->cacheable = 0;
- /* fall through */
-
- case NGX_ERROR:
- return NGX_OK;
-
- default:
- r->cache->valid_sec = ngx_time() + n;
+ } else if (n > 0) {
+ u->cacheable = 1;
+ } else if (n == NGX_ERROR) {
return NGX_OK;
}
+ r->cache->valid_sec = ngx_time() + n;
+ return NGX_OK;
}
Change History (2)
comment:1 by , 4 years ago
| Description: | modified (diff) |
|---|
comment:2 by , 4 years ago
| Resolution: | → duplicate |
|---|---|
| Status: | new → closed |

Please see Contributing Changes for a recommended way to submit patches. Trac isn't the best place to review patches.
Overall, the approach looks too fragile. Further, it doesn't seem to solve stale-while-revalidate and stale-if-error times, which also behave differently depending on the headers order, as well as similar problem with Expires vs. Cache-Control and non-cacheable flag.
Closing this as a duplicate of #964, which is basically about the same issue in Expires vs. Cache-Control.