我需要将表单的 API 请求代理api.myserver.com/service/v1/pricing
到正确的后端服务。
我是这样配置nginx的:
location /service/v1 {
proxy_pass https://service-v1-pool/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
proxy_ssl_server_name on;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
upstream service-v1-pool {
least_conn;
keepalive 32;
server 192.168.1.10:8000;
}
我在那个私人地址上设置了一个基本的服务器。
问题是,如果我向 发出请求api.myserver.com/service/v1/pricing
,服务器将看到一个GET //pricing
触发 的请求404 Not Found
。正确的请求应该是GET /pricing
。我在 NGINX 中遗漏了什么吗?问候
答案1
你错过了有关 URI 转换的部分
https://nginx.org/r/proxy_pass
请求 URI 传递到服务器如下:
- 如果使用 URI 指定了 proxy_pass 指令,那么当请求传递到服务器时,那个部分规范化请求 URI匹配位置被替换通过指令中指定的 URI
在您的情况下,URI 是/service/v1/pricing
,匹配部分是/service/v1
,并且它被替换为 ,/
因此您得到了//pricing
。
只需添加一个尾部斜杠location
就可以了。
location /service/v1/ {
proxy_pass https://service-v1-pool/;
...
}
答案2
解决方案是在位置块中使用正则表达式:
location ~ ^/service/v1/(.*)$ {
proxy_pass https://service-v1-pool/$1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
proxy_ssl_server_name on;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
或者更简单,如评论中所建议的:
location /service/v1/ {
proxy_pass https://service-v1-pool/;
...
}