我正在尝试设置一个 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
通过删除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;
}