如何在nginx中将子域名作为proxy_pass值传递?

时间:2015-08-03 17:46:33

标签: nginx reverse-proxy proxypass

我目前处于需要获取/捕获子域并将该子域值传递给Nginx配置中的proxy_pass的情况。

e.g。

如果用户输入

http://google.com.mydomain.com

然后它应该代理传递为

proxy_pass http://www.google.com/;
上面示例google.com中的

sub-domain

这可行吗? 我怎样才能在nginx中实现类似的东西?

目前我正在使用配置,其中子域值在配置文件中是硬编码的,但是有很多子域,所以我需要这样做,但不知道正确的语法。 / p>

server {
    listen       80;
    server_name  subdomain.domain.com;
    charset utf-8;

    location / {
      proxy_pass http://www.subdomain/;
    }
}

我使用*作为A记录将所有子域重定向到我的web主机,即通配符DNS。

更新:

我找到了来自https://stackoverflow.com/a/22774520/1642018

的代码段
server {          
    listen       80;                                               
  # this matches every subdomain of domain.
  server_name .domain.com;                                           

  location / {                                                   

    set $subdomain "";

    if ($host ~* "^(.+)\.domain.com$") {                             
      set $subdomain $1;                                         
    }                                                            

    proxy_pass http://$subdomain;   

  }                                                              
} 

但请求显示的是我的默认网页根目录中的默认页面。

2 个答案:

答案 0 :(得分:2)

两件事。

1-解析器(nginx的dns服务器,以解析google.com,您可以在主机上添加或者您可以添加解析器声明)

2-您需要解决客户处理不同域名的问题,我的意思是google.com与google.com.ar或google.fr不同

在这个例子中,我为你的例子google.com做了工作

worker_processes 4;

error_log /var/log/nginx/error.log;

events {
  worker_connections  1024;
}

http {

  server {
    listen       80;

    location / { 
      set $subdomain ""; 

      if ($host ~* "^(.+)\.domain.com$") {
        set $subdomain $1; 
      }   
      resolver 8.8.8.8;
      proxy_pass "http://$subdomain.com";

    }   
  }
}

我希望这种配置对您有所帮助。

答案 1 :(得分:1)

如果定义了变量,我会使用map捕获子域,然后代理传递:

map $host $subdomain {
    ~^(?<sub>.+)\.[^\.]+\.[^\.]+$ $sub;
}

server {          
    listen 80 default_server;
    server_name  _;

    location / {
        if ($subdomain) {
            proxy_pass http://$subdomain;   
        }                             
    }                                                              
}