I'm trying to accomplish three things:
- Map traffic, by subdomain, to one of several applications on different ports.
- If subdomain isn't recognized, redirect to www.
- Require HTTPS on all subdomains.
My nginx configuration so far is:
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;
}
}
This almost works (it accomplishes #1 and #3), but instead of redirecting foo.mydomain.com
to www.mydomain.com
, it just serves the www
content without redirecting. I'm not sure how to redirect un-mapped subdomains without splitting the whole thing into separate server
blocks, which I'd really rather not do.
Is there a way to redirect all subdomains not explicitly mentioned in the map to www
?
Just implement a default server. Here's mine
You can do whatever action you want.
Just to say that on AWS, I needed to add an A record "*.staging.mydomain.com" in Route53 pointing to the same EC2 instance IP (like the record for "staging.mydomain.com")
The following works for me...
Here is the change in Nginx config to make it work...
I used 8888 as the default port. Any unused port should work.