Prevent reverse proxy from sending range headers to source server

Hello everyone!

I set up my reverse proxy to cache files stored at AWS S3. I want to
minimize the amount of traffic generated at AWS.

Many of the files are mp4s. Clients make GET requests with the range
set. A
video player may get multiple chunks of a file at once.

How can I have the proxy server NOT send the client’s Range header along
to
AWS S3? I want the cached version to be used. The file should only be
revalidated after the set period of 30 days.

So it seems like I would need something along proxy_set_header but
something
that unsets the header sent to the proxied server.

E.g. proxy_set_header Range NULL

The proxy_ignore_headers option won’t take Range.

I appreciate any help.

Posted at Nginx Forum:

From the docs (
Module ngx_http_proxy_module):

If the value of a header field is an empty string then this field will
not
be passed to a proxied server:

proxy_set_header Range “”;

proxy_ignore_header is meant to handle response headers, not request
headers

No idea how I missed that. Thank you very much!

Also for people that might find this thread later:

Adding the parameter “updating” to the directive “proxy_cache_use_stale”
is
important as well if you want to minimize the traffic the origin server
generates.

proxy_cache_use_stale updating;
proxy_set_header Range “”;

Posted at Nginx Forum:

Hello!

On Thu, Feb 04, 2016 at 08:38:15PM -0500, FSC wrote:

revalidated after the set period of 30 days.

So it seems like I would need something along proxy_set_header but something
that unsets the header sent to the proxied server.

As already mentioned by Robert, proxy_set_header with an empty
value will prevent a header from being sent to upstream servers.

Note well that when caching is enabled, nginx will not send the
Range header to upstream servers. It is removed automatically
along with several other headers, see
http://nginx.org/r/proxy_set_header:

: If caching is enabled, the header fields “If-Modified-Since”,
: “If-Unmodified-Since”, “If-None-Match”, “If-Match”, “Range”, and
: “If-Range” from the original request are not passed to the proxied
: server.

That is, there is no need to do anything special with the Range
header.


Maxim D.
http://nginx.org/