When nginx is configured as reverse proxy, can it rewrite the host header to the downstream server like Apache's ProxyPreserveHost?

Solution 1:

I think I found a solution to the problem. Sending the downstream server's host is the default behavior in nginx, and I had overridden it by using the directive:

proxy_set_header Host $host;

Which sends the host requested by the browser to the downstream server. Exactly the opposite of what I wanted.

So while nginx doesn't have an equivalent to Apache's ProxyPreserveHost, the same behavior can be achieved with the proxy_set_header directive, and nginx's solution is more general.

Solution 2:

A working example:

  set $s3_bucket 'SOMEBUCKET.s3.amazonaws.com';

  location / {
        send_timeout 5m;
        proxy_read_timeout 240;
        proxy_send_timeout 240;
        proxy_connect_timeout 240;
        proxy_http_version 1.1;
        proxy_set_header Host $s3_bucket;
        proxy_set_header Authorization '';
        proxy_hide_header x-amz-id-2;
        proxy_hide_header x-amz-request-id;
        proxy_ignore_headers "Set-Cookie";
        proxy_buffering off;
        proxy_intercept_errors on;
        proxy_redirect off;
        resolver 8.8.8.8;
        proxy_pass http://$s3_bucket;
        }