我想代理一个请求到另一台使用proxy_pass的服务器,同时删除匹配的路径前缀。我相信这样做的一种方式如下:NGINX proxy_pass删除路径前缀并解析DNS
location /a/ {
proxy_pass https://website.com/
}
例如, http://localhost/a/b.html
的请求将代理到https://website.com/b.html
。
据我所知在NGINX上的非商业版本中的问题是website.com
的DNS A记录将在启动时被永久加载和缓存。我已经看到了一种技术,通过在proxy_pass指令中使用诸如$request_uri
的变量来解决此问题,从而迫使NGINX根据记录的TTL重新解析DNS。
E.g.
location /a/ {
rewrite ^/a/(.*) /$1 break;
proxy_pass https://website.com/$request_uri
}
不幸的是,似乎上述不起作用,因为它似乎仍然通过/ a /前缀到上游。
基本上我想要在这里实现的是代理一个请求,同时删除路径前缀,以便DNS记录不会永久缓存。
谢谢。
谢谢你的回复,我今天会测试一下,如果它能正常工作,我会标记接受的答案。我发现以前关于解决方案的建议[这里](http://gc-taylor.com/blog/2011/11/10/nginx-aws-elb-name-resolution-resolvers)。我相当确信,在解决DNS问题上,这具有“预期”的效果,因为如果没有这种情况,每隔几天左右上游就不再可用,我需要重新启动。我已经运行了3个多月,现在没有重新启动,并且自从进行更改以来我没有遇到任何DNS问题。 –
呵呵,是的,如果nginx在proxy_pass内存在任何变量的情况下解决了所有主机名的5分钟缓存,那将是有道理的;它实际上甚至以这种方式记录下来,但它并不十分明确!每天学习! :-)因此,我想上面的应该可以工作,你甚至应该在'.com'之后去掉'/',例如''。com $ uri' – cnst
因此,初步测试似乎可以与你原来的建议'重写^/a /(.*)/ $ 1 break; proxy_pass https://website.com/$uri$is_args$args;)'但与刚'.COM $ uri'(查询参数不会传播到上游OK,我会第一建议坚持谢谢对于回复! –