web-dev-qa-db-ja.com

NGINXの書き換え中にヘッダーを保持する

クエリ文字列引数の内容に基づいて、すべてのリクエストを2つのサーバーのいずれかにリダイレクトするようにNGINXプロキシを設定しようとしています。基本的に:

https://my.site.com/api/...&server=a

にリダイレクトする必要があります

https://a.site.com/api/...&server=a

そして

https://my.site.com/api/...&server=b

にリダイレクトする必要があります

https://b.site.com/api/...&server=b

ホスト名を書き換えてクエリ文字列をそのまま維持するという基本的な作業を行う構成があるようです。

error_log /dev/stdout info;
worker_processes 1;

events {
    worker_connections 1024;
    accept_mutex off;
}

http {
    access_log /dev/stdout combined;
    sendfile on;

    server {
        listen 443 ssl;
        server_name         $hostname;
        ssl_certificate     /etc/ssl/nginx.crt;
        ssl_certificate_key /etc/ssl/nginx.key;
        ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers         HIGH:!aNULL:!MD5;

        location ~ /api/ {
            if ($arg_server !~ "^(a|b)$") { return 404; }
            rewrite ^ $scheme://my.site.$arg_server.com$uri;
        }
    }
}

ただし、元のリクエストのすべてのヘッダーを取得して、旅を生き残ることはできないようです。たとえば、Authorizationヘッダーはhttps://[server].site.com/api/...に到達していないようです。

私の理解では、すべてのヘッダーがデフォルトで保持されていましたか?それは本当ではありませんか?

1
JimmidyJoo

rewriteを削除し、それをproxy_passおよびresolverエントリに置き換えることで、達成したいことを実行できました。

    location /api/ {
        if ($arg_server !~ "^(a|b)$") { return 404; }

        resolver dns.site.com;
        proxy_pass $schemes://my.site.$arg_server.com$request_uri;
    }
2
JimmidyJoo