NGINX proxy_pass 删除路径前缀并解析 DNS

NGINX proxy_pass remove path prefix & resolve DNS

我想使用 proxy_pass 将请求代理到另一台服务器,同时删除匹配的路径前缀。我相信这样做的一种方法如下;

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。

例如

location /a/ {
  rewrite ^/a/(.*) /  break;
  proxy_pass https://website.com/$request_uri
}

不幸的是,上面的方法似乎不起作用,因为它似乎仍然将 /a/ 前缀传递给上游。

基本上我想在这里实现的是代理请求,同时删除路径前缀,这样 DNS 记录就不会永远缓存。

谢谢。

我不确定你在哪里见过它,但只是专门使用 $request_uri 肯定不会神奇地让 nginx 动态地为你解析域名。

也许建议的是显式使用变量,例如 $uri(这是一个不同的变量),假设在使用变量时,每次都会单独解析域名,没有任何缓存?我不确认也不否认这样的假设是否正确,但下面至少会为你去掉/a

location /a/ {
  rewrite ^/a/(.*) /  break;
  proxy_pass https://website.com/$uri$is_args$args;
}

(请注意,如果确实实现了不缓存域名,那么您不妨运行一个本地解析器,否则,您的托管服务提供商的 DNS 的额外延迟和停机时间将立即影响您的网站,更不用说他们的服务器可能的 DNS 查询限制了。)


也许更好的解决方案是定期重启 nginx 以自动获取 DNS 中的更改?例如,nginx -s reloadkill -HUP? As explained in http://nginx.org/en/docs/beginners_guide.html#control and http://nginx.org/en/docs/control.html#reconfiguration,nginx 在重新加载期间从不停止处理任何请求,因此这应该是一个安全的操作;而且它很可能也会导致 DNS 被刷新。