在 Nginx 中,将特定子域映射到端口,重定向所有其他子域

在 Nginx 中,将特定子域映射到端口,重定向所有其他子域

我正在努力完成三件事:

  1. 按子域将流量映射到不同端口上的多个应用程序之一。
  2. 如果无法识别子域名,则重定向至 www。
  3. 要求所有子域都使用 HTTPS。

到目前为止我的 nginx 配置是:

map $subdomain $subdomain_port {
  default    8000;
  www        8000;
  subdomain1 8001;
  subdomain2 8002;
  subdomain3 8003;
}

server {
    listen 80;
    listen [::]:80;
    server_name _;
    return 301 https://$host$request_uri;
}

server {
    listen              443 ssl;
    server_name         ~^(?P<subdomain>.+?)\.mydomain\.com$;

    ssl_certificate     <cert>;
    ssl_certificate_key <key>;

    location / {
      # ... various proxy headers, then ...
      proxy_pass http://127.0.0.1:$subdomain_port;
      proxy_redirect off;
    }
}

几乎可以工作(它实现了第 1 点和第 3 点),但它没有重定向foo.mydomain.comwww.mydomain.com,而是只提供www内容而不进行重定向。我不确定如何在不将整个内容拆分成单独的server块的情况下重定向未映射的子域,我真的不想这样做。

有没有办法将地图中未明确提及的所有子域重定向到www

答案1

只需实现一个默认服务器。这是我的

server {
  listen      80 default_server;
  server_name _;
  return 302 https://www.example.com;
}

你可以做任何你想做的事。

答案2

只是说在 AWS 上,我需要在 Route53 中添加一个指向同一 EC2 实例 IP 的 A 记录“*.staging.mydomain.com”(如“staging.mydomain.com”的记录)

答案3

以下对我有用...

  1. 让默认端口与 www 的端口不同。
  2. 让 Nginx 在默认端口监听,并将所有流量重定向到 www。

以下是 Nginx 配置中的更改以使其正常工作...

map $subdomain $subdomain_port {
  default    8888;
  www        8000;
  subdomain1 8001;
  subdomain2 8002;
  subdomain3 8003;
}

server {
    listen 8888;
    server_name _;
    return 301 https://www.domainname.com/$request_uri;
}

# other configs remain the same

我使用 8888 作为默认端口。任何未使用的端口都可以使用。

相关内容