我正在努力完成三件事:
- 按子域将流量映射到不同端口上的多个应用程序之一。
- 如果无法识别子域名,则重定向至 www。
- 要求所有子域都使用 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.com
到www.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
以下对我有用...
- 让默认端口与 www 的端口不同。
- 让 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 作为默认端口。任何未使用的端口都可以使用。