nginx从uri捕获端口号并设置proxy_pass

j1dl9f46  于 12个月前  发布在  Nginx
关注(0)|答案(1)|浏览(123)

遵循this post我可以成功地手动加载端口。例如,使用以下nginx.conf:

location /port {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Host $http_host;
    proxy_pass http://localhost:5001;
}

字符串
如果我想重定向和端口范围(5001-5228),我必须手动创建位置。为了避免这种情况,我想使用正则表达式方法捕获端口号。我尝试了以下方法:

location ~^/port/(.*)$ {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Host $http_host;
    proxy_pass http://localhost:$1;
    add_header X-debug-message "input: $1" always;
    add_header X-debug-message-2 "request_uri: $request_uri" always;
    add_header X-uri "uri: $uri" always;
}


我从这个实现中得到的响应头是:Content-Type: text/html Server: nginx/1.17.3 X-Debug-Message: input: 5002 X-Debug-Message-2: request_uri: /port/5002 X-Uri: uri: /port/5002
Nginx插件显示:error 4512#4512: \*1 no resolver defined to resolve localhost
this post之后,我将解析器设置为0.0.0.0、127.0.0.1和/etc/resolv.conf显示的内容,但要么不返回解析器,要么返回*1 localhost could not be resolved (110: Operation timed out)
我还尝试了以下选项内

location ~^/port/(.*)$ /{
    ...
    rewrite /port/(.\*) $1 break;
    set $upstream http://localhost:$1;
    proxy_pass $upstream;
}


返回:Content-Type: text/html Server: nginx/1.17.3 X-Debug-Message: input: 5002 X-Debug-Message-2: request_uri: /port/5002 X-Uri: uri: 5002
Nginx插件显示:error 4638#4638: \*5 invalid URL prefix in ""
如何设置nginx.conf地址块,使带有/port/50 xx的调用将被重定向到带有port的localhost?提前感谢!

ego6inou

ego6inou1#

回答我自己的问题。为其他遇到类似问题的人保持开放。我最终使用了以下内容:

location ~^/port/(?<port>\d+)/(.*)$ {
        resolver 127.0.0.1;
        set $upstream "http://127.0.0.1:$port";
        proxy_pass $upstream/$2$is_args$args;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

字符串
我学到的是通过位置(?<port>\d+)分配$port变量,并使用uri创建一个后端字符串。然后代理传递该后端变量。通过将解析器移动到位置块中,解决了解析器问题。

相关问题