クエリ文字列引数の内容に基づいて、すべてのリクエストを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/...
に到達していないようです。
私の理解では、すべてのヘッダーがデフォルトで保持されていましたか?それは本当ではありませんか?
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;
}