proxy_pass中的nginx变量(cname)

asc*_*d00 1 nginx

我正在尝试动态设置proxy_pass目标,其中变量将是原始请求的cname.

我现在拥有的是:

server {
    listen       8888;
    server_name (.*).domain.com;

    location / {
        proxy_pass       http://$1.otherdomain.com;
        proxy_set_header Host $1.otherdomain.com;
Run Code Online (Sandbox Code Playgroud)

但不幸的是,这最终会出现在502坏网关中.在proxy_pass和中使用变量时没有任何作用proxy_set_header.

我也尝试使用(?<cname>.+)(?P<cname>.+)在服务器名称和$cname变量.

有什么不对,为什么它最终会在502?

Chu*_* Ma 7

要在服务器名称中使用正则表达式,您需要在名称前添加代字号"〜"

server_name ~(.*).domain.com;
Run Code Online (Sandbox Code Playgroud)

[ 更新 ]尝试了它并成功设置了$ 1的值.但仍然得到502和我的nginx错误日志显示

no resolver defined to resolve xyz.otherdomain.com
Run Code Online (Sandbox Code Playgroud)

即使我在/ etc/hosts文件中将该名称指向我的localhost.

找到能够很好地解释这个问题的文章.基本上在这种特殊情况下(上游域名中的变量),您需要使用"resolver"指令指向可以解析此动态域名的dns服务器(例如,来自谷歌dns服务器的8.8.8.8).

resolver 8.8.8.8;
Run Code Online (Sandbox Code Playgroud)

它在我的测试中使用公共上游域名.如果您的上游域名是本地的,则需要为它们设置本地DNS服务器.

  • 注意:如果您在proxy_pass指令中对域名进行硬编码,则一切正常.不需要dns解析器.在这种情况下,我猜nginx在解析配置文件时会找到这些名称的IP地址. (3认同)