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

2 reverse-proxy nginx proxypass

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

例如

如果用户输入

http://google.com.mydomain.com
Run Code Online (Sandbox Code Playgroud)

那么它应该做代理传递

proxy_pass http://www.google.com/;
Run Code Online (Sandbox Code Playgroud)

在上面的例子中google.comsub-domain

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

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

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

    location / {
      proxy_pass http://www.subdomain/;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

更新:

我从/sf/answers/1594216431/找到了代码片段

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;   

  }                                                              
} 
Run Code Online (Sandbox Code Playgroud)

但请求显示的是我的默认页面,该页面位于我的默认网络根目录中。

Hor*_*cio 6

两件事情。

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";

    }   
  }
}
Run Code Online (Sandbox Code Playgroud)

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