Nginx changes the hostname of proxy_pass into ip address unwantedly

I have configured nginx to use mod_zip to zip up multiple files.

I also have configured nginx so that it proxies to s3 when our server
gets a
request to /images.

location /p/ {
proxy_pass http://bucket-name.s3.amazonaws.com;
}
When I access a file via < server >/images/foo.png, everything works
great.

However, when I try using mod_zip, the
http://bucket-name.s3.amazonaws.com
gets rewritten to an ip address

http://54.231.176.194:80/foo.png

S3 needs the bucket-name in the url and gives me a NoSuchBucket error
when I
try using the ip address

I get the following error

2015/12/01 01:37:08 [error] 14955#0: *16 mod_zip: a subrequest returned
400,
aborting… while reading response header from upstream, client:
172.31.10.100, server: convoygarage.com, request: “GET /api/get_zipfile
HTTP/1.1”, subrequest: “/p/foo.png”, upstream: “http://
54.231.176.194:80/foo.png”, host: “convoygarage.com

Why is nginx or mod_zip rewriting the hostname portion of my s3 URL into
an
ip address?

Posted at Nginx Forum:

Hello!

On Tue, Dec 01, 2015 at 08:42:43PM -0500, [email protected] wrote:

However, when I try using mod_zip, the http://bucket-name.s3.amazonaws.com
aborting… while reading response header from upstream, client:
172.31.10.100, server: convoygarage.com, request: “GET /api/get_zipfile
HTTP/1.1”, subrequest: “/p/foo.png”, upstream: “http://
54.231.176.194:80/foo.png”, host: “convoygarage.com

Why is nginx or mod_zip rewriting the hostname portion of my s3 URL into an
ip address?

Note that “upstream” as logged to error log shows an IP address of
a particular server used, not a host name used in the request.
This is intentional behaviour to make it easy to debug which
backend server caused an error.

To find out what was in fact sent in the Host request header
you’ll have to look into debugging log (or use tcpdump to see what
is actually sent though the wire).


Maxim D.
http://nginx.org/