NGINX proxy_pass删除路径前缀&;解析DNS

NGINX proxy_pass删除路径前缀&;解析DNS,nginx,proxypass,Nginx,Proxypass,我想在删除匹配路径前缀的同时,使用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\u

我想在删除匹配路径前缀的同时,使用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\u pass指令中使用一个变量,如
$request\u uri
,从而迫使NGINX根据记录的TTL重新解析DNS

例如

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

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


谢谢。

我不确定您在哪里见过它,但仅仅使用
$request\u uri
肯定不会神奇地让nginx为您动态解析域名

也许有人建议显式使用变量,例如
$uri
(这是一个不同的变量),假设在使用变量时,每次都单独解析域名,而不进行任何缓存?我不确认或否认这样的假设是否正确,但以下内容至少可以帮你摆脱
/a

location /a/ {
  rewrite ^/a/(.*) /$1  break;
  proxy_pass https://website.com/$uri$is_args$args;
}
(请注意,如果确实实现了不缓存域名,那么您最好运行本地解析程序,否则,托管提供商DNS的额外延迟和停机时间将立即影响您的站点,更不用说其服务器的DNS查询限制了。)



也许更好的解决方案是定期重启nginx以自动获取DNS中的更改?例如,
nginx-s重新加载
或?如和中所述,nginx在重新加载期间从不停止处理任何请求,因此它应该是一种安全的操作;这很可能会导致DNS被刷新。

谢谢您的回复,我今天将对此进行测试,如果效果良好,我会将此答案标记为接受。我找到了之前关于决议的建议。我很有信心,就解析DNS而言,这会产生“预期”效果,因为以前如果没有这一点,上游将不再可靠地每隔几天左右可用,我需要重新启动。我已经让它像这样运行了3个多月了,现在没有重新启动,而且自从做了那个更改之后,我还没有遇到任何DNS问题。哦,是的,如果nginx在proxy_pass中存在任何变量的情况下将它解析的所有主机名缓存5分钟,那就有意义了;事实上,它甚至是这样记录的,但它不是很明确!每天学习!:-)因此,我想上述方法应该有效,您甚至应该在
.com
之后删除
/
,例如,应该是
.com$uri
,因此初步测试似乎可以与您最初的建议一起工作
重写^/a/(.*)/$1 break;代理通行证https://website.com/$uri$is_args$args;)
但仅使用
.com$uri不正常
(查询参数不会传播到上游。我将坚持第一个建议。感谢您的回复!@DavidGoate,我说过在
$uri
之前只省略
/
,而不是它周围的全部内容!如果您省略
$is_args$args
,那么当然不会传播查询,因为
$uri,只存在于
$request\u uri
中,如前所述,这是一个完全不同的变量!感谢您的回答!它完成了任务
location /a/ {
  rewrite ^/a/(.*) /$1  break;
  proxy_pass https://website.com/$uri$is_args$args;
}