【问题标题】:nginx proxy_pass dynamic hostname partnginx proxy_pass 动态主机名部分
【发布时间】:2016-05-10 10:51:17
【问题描述】:

当 nginx proxy_pass 是期望通过替换 URL 中的主机名部分来构建的动态值时,nginx 无法代理请求并出现错误:no resolver defined to resolve service where 服务=$1。与其尝试解析 service.abcd.local,不如尝试解析 service。有解决办法吗?

location ~ ^/(.*)/(.*)$ {
  proxy_pass http://$1.abcd.local/$1/$2;   
}

【问题讨论】:

  • 您是否添加了解析器(resolver 指令)?
  • 顺便说一句,对于像/a/b/c/d这样的url,你的正则表达式将导致$1 = /a/b/c$2 = d,并且代理url将是http://a/b/c/.abcd.local/....,而nginx绝对正确尝试解析主机名a .
  • 阿列克谢 - 谢谢。那是对的。正则表达式是错误的。修复正则表达式后,仍然无法尝试解析 service.abcd.local。如果 proxy_pass 被硬编码为 service.abcd.local nginx 正在解析并且能够代理。
  • 再一次,你添加resolver了吗?
  • 否 - 是否需要显式解析器? nginx 正在亚马逊 VPC 中运行,解析为 *.abcd.local。

标签: nginx


【解决方案1】:

在 nginx 的文档中指定 proxy_pass:

服务器名称、端口和传递的 URI 也可以使用变量指定:

proxy_pass http://$host$uri;

[…]

在这种情况下,将在描述的服务器组中搜索服务器名称,如果未找到,则使用解析器确定。

【讨论】:

  • 所以这意味着如果proxy_pass中存在变量,则必须明确指定解析器?
  • 是的,如果主机部分中存在变量。或者,您必须为所有可能的主机定义 服务器组
  • 这澄清了事情。谢谢。
猜你喜欢
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 2018-02-19
  • 2011-08-10
  • 2019-02-04
  • 2018-10-30
相关资源
最近更新 更多