![如何根据请求头选择上游](https://linux22.com/image/763984/%E5%A6%82%E4%BD%95%E6%A0%B9%E6%8D%AE%E8%AF%B7%E6%B1%82%E5%A4%B4%E9%80%89%E6%8B%A9%E4%B8%8A%E6%B8%B8.png)
如果设置了特定的标头,我会尝试将请求发送到不同的服务器,
它会给出错误“http://”中的无效 URL 前缀
这是我的 nginx 配置文件
upstream server1 {
server localhost:5000;
}
upstream server2 {
server 172.31.15.137;
}
# the nginx server instance
server {
listen 80;
listen [::]:80;
server_name dev.i2e1.in;
access_log /var/log/nginx/dev.i2e1.in.log;
# pass the request to the node.js server with the correct headers
# and much more can be added, see nginx config options
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://$http_x_custom_header;
}
}
缺什么?
答案1
看来X-Custom-Header
您发出的请求中没有设置 HTTP 标头。
proxy_pass
未经任何验证就使用标头作为目标是非常不安全的。
我将使用它map
来过滤有效端点并强制使用默认端点:
在http
级别中,添加以下内容map
:
map $http_x_custom_header $upstream {
server1 server1;
server2 server2;
default server1;
}
然后使用:
proxy_pass http://$upstream;