Ordnen Sie in Nginx bestimmte Subdomains Ports zu und leiten Sie alle anderen um

7

Ich versuche drei Dinge zu erreichen:

  1. Ordnen Sie den Datenverkehr nach Subdomain einer von mehreren Anwendungen an verschiedenen Ports zu.
  2. Wenn die Subdomain nicht erkannt wird, leiten Sie sie an www weiter.
  3. HTTPS für alle Subdomains erforderlich.

Meine bisherige Nginx-Konfiguration lautet:

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

Diese fast funktioniert (es erreicht # 1 und # 3), aber statt Umleitung foo.mydomain.comzu www.mydomain.com, es dient nur der wwwInhalt ohne Umleiten. Ich bin mir nicht sicher, wie ich nicht zugeordnete Subdomains umleiten soll, ohne das Ganze in separate serverBlöcke aufzuteilen, was ich wirklich lieber nicht tun würde.

Gibt es eine Möglichkeit, alle in der Karte nicht explizit genannten Subdomains an umzuleiten www?

Don McCurdy
quelle
Randnotiz: Wenn Sie LetsEncrypt verwenden, ist ein Teil dessen, was ich hier frage, leider unmöglich. LetsEncrypt unterstützt keine Platzhalterzertifikate (Stand 04/2016), daher können Sie nur Subdomains umleiten, für die Sie ein Zertifikat haben: serverfault.com/questions/741182/…
Don McCurdy

Antworten:

1

Implementieren Sie einfach einen Standardserver. Hier ist meins

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

Sie können jede gewünschte Aktion ausführen.

Tim
quelle
Dies sieht so aus, als würde der gesamte Nicht-HTTPS-Verkehr unabhängig von der Subdomain 444. In diesem Fall wird Nr. 2 oder Nr. 3 oben nicht angesprochen. Wenn nicht, können Sie erklären, was dies bewirkt?
Don McCurdy
Ich habe die letzte Zeile in eine temporäre Umleitung geändert. Sie könnten auch eine permanente 301-Umleitung verwenden, aber ich denke, 302 ist in diesem Fall besser, falls später eine Subdomain hinzugefügt wird. Ich dachte, Sie müssten nur etwas über die Direktive default_server wissen und könnten den Rest von dort aus erledigen.
Tim
1

Um nur zu sagen, dass ich in AWS einen A-Datensatz "* .staging.mydomain.com" in Route53 hinzufügen musste, der auf dieselbe EC2-Instanz-IP verweist (wie der Datensatz für "staging.mydomain.com").

Shadi
quelle
0

Folgendes funktioniert für mich ...

  1. Der Standardport soll sich vom Port für www unterscheiden.
  2. Lassen Sie Nginx im Standardport lauschen und leiten Sie den gesamten Datenverkehr an www um.

Hier ist die Änderung in der Nginx-Konfiguration, damit es funktioniert ...

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

Ich habe 8888 als Standardport verwendet. Jeder nicht verwendete Port sollte funktionieren.

Pothi Kalimuthu
quelle