NGINX - 在proxy_pass中使用变量会中断路由

时间:2017-09-15 01:12:28

标签: variables nginx proxypass resolver

我正在尝试让NGINX的解析器自动更新DNS解析缓存,因此我正在转换为使用变量作为proxy_pass值来实现这一点。但是,当我使用变量时,它会将所有请求转到请求的根端点,并切断URL的任何其他路径。这是我的配置:

resolver 10.0.0.2 valid=10s;

server {
    listen 80;
    server_name localhost;

    location /api/test-service/ {
        proxy_redirect     off;

        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

        # If these 2 lines are uncommented, 'http://example.com/api/test-service/test' goes to 'http://example.com/api/test-service/'
        set $pass_url http://test-microservice.example.com:80/;
        proxy_pass  $pass_url;

        # If this line is uncommented, things work as expected. 'http://example.com/api/test-service/test' goes to 'http://example.com/api/test-service/test'
        # proxy_pass  http://test-microservice.example.com:80/;

    }

这对我没有任何意义,因为硬编码的URL和变量的值是相同的。有什么我想念的吗?

编辑:啊,所以我发现了这个问题。但我不完全确定如何处理它。由于这是一个反向代理,我需要proxy_pass从URI中删除/api/test-service/,然后再将其传递给代理。所以..

此:

http://example.com/api/test-service/test

应该代理:

http://test-microservice.example.com:80/test

但代之以:

http://test-microservice.example.com:80/api/test-service/test

当我没有使用变量时,它就没问题了。但变量增加了它。那只是固有的使用变量会做什么?

1 个答案:

答案 0 :(得分:3)

您在文档中遗漏了一小部分

  

在proxy_pass中使用变量时:

location /name/ {
  proxy_pass http://127.0.0.1$request_uri;
}
     

在这种情况下,如果在指令中指定了URI,它将按原样传递给服务器,替换原始请求URI。

因此您需要将配置更改为

set $pass_url http://test-microservice.example.com:80$request_uri;
proxy_pass  $pass_url;