#1359 closed defect (invalid)
Map command map $upstream_http_cache_control $bypass_cache_control ignored with proxy_cache_bypass $bypass_cache_control
Reported by: | Owned by: | ||
---|---|---|---|
Priority: | minor | Milestone: | |
Component: | nginx-module | Version: | 1.13.x |
Keywords: | map, proxy_cache_bypass | Cc: | Neil.Craig@…, Paul.Merry@… |
uname -a: | Linux playpen02 3.10.0-514.26.2.el7.x86_64 #1 SMP Tue Jul 4 15:04:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux | ||
nginx -V: |
nginx version: nginx/1.13.4
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) built with OpenSSL 1.0.1e-fips 11 Feb 2013 TLS SNI support enabled configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie' |
Description
We are using the following map directive:
map $upstream_http_cache_control $bypass_cache_control { "max-age=60" 1; default 0; }
Within location block we have:
location / { ---snip--- proxy_cache_bypass $bypass_cache_control; ---snip--- }
Like this our map command does is not remapping. From a client we see:
$ curl --head http://playpen02/benula/Aldjia.jpg HTTP/1.1 200 OK Server: nginx/1.13.4 Date: Thu, 17 Aug 2017 15:42:44 GMT Content-Type: image/jpeg Content-Length: 0 Connection: keep-alive Cache-Control: max-age=60 upstream_http_cache_control: :max-age=60: Mapped_Cache-Control: 0 X-Proxy-Cache: HIT
If we remove proxy_cache_bypass $bypass_cache_control
location / { ---snip--- # proxy_cache_bypass $bypass_cache_control; ---snip--- }
we now see our map statement working as expected;
$ curl --head http://playpen02/benula/Aldjia.jpg HTTP/1.1 200 OK Server: nginx/1.13.4 Date: Thu, 17 Aug 2017 15:44:47 GMT Content-Type: image/jpeg Content-Length: 0 Connection: keep-alive Cache-Control: max-age=60 upstream_http_cache_control: :max-age=60: Mapped_Cache-Control: 1 X-Proxy-Cache: EXPIRED
Why are we seeing the difference in behaviour when the inclusion of the proxy_cache_bypass directive?
Attachments (1)
Change History (3)
by , 7 years ago
Attachment: | nginx_map_with_proxy_bypass_behaviour added |
---|
comment:1 by , 7 years ago
Resolution: | → invalid |
---|---|
Status: | new → closed |
The proxy_cache_bypass directive determines if the cache will be used to serve a particular request. Obviously this happens before nginx contacts an upstream server, and hence before the $upstream_http_cache_control
variable becomes available. As such, the map
will be evaluated with an empty source value, and the result will be 0
, and this result will be cached for further request processing. If you don't want nginx to cache the result, consider using the volatile parameter in the map. On the other hand, from the above explanation it should be clear that the configuration you are using simply does not make sense.
nginx -V output. Also expected and actual curl output.