我想代理一个请求到另一个使用proxy_pass的服务器,同时删除匹配的路径前缀。我相信这样做的一种方法是:
location /a/ {
proxy_pass https://website.com/
}例如,对http://localhost/a/b.html的请求将被代理到https://website.com/b.html。
据我所知,在NGINX上的非商业版本中的问题是,website.com的DNS记录将在启动时永远加载和缓存。我看到了一种技术,可以通过在proxy_pass指令中使用变量来解决这个问题,从而强制NGINX根据记录的TTL重新解析DNS。
例如。
location /a/ {
rewrite ^/a/(.*) /$1 break;
proxy_pass https://website.com/$request_uri
}不幸的是,上面的方法似乎不起作用,因为它似乎仍然将/a/前缀传递给上游。
基本上,我想在这里实现的是代理一个请求,同时删除路径前缀,这样DNS记录就不会被永远缓存。
谢谢。
发布于 2015-10-25 10:32:56
我不确定你在哪里见过它,但仅仅使用$request_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 reload还是kill -HUP?正如在http://nginx.org/en/docs/beginners_guide.html#control和http://nginx.org/en/docs/control.html#reconfiguration中解释的那样,nginx在重新加载期间从不停止处理任何请求,因此它应该是一个安全的操作;它很可能也会导致DNS被刷新。
https://stackoverflow.com/questions/33218367
复制相似问题