Ich brauche eine Möglichkeit, Clients umzuleiten, wenn kein vorhandener Pfad definiert ist. Wenn ich eine Return 301-Konfiguration einfüge, scheint nginx alle Standortkonfigurationen zu ignorieren. Es leitet alles um.

Der Hostname in der Umleitung muss dynamisch sein (vom Client kommen). Diese Server sind eigentlich Container und werden in Dev/Prod-Umgebungen bereitgestellt. Die Client-URL ändert sich also von etwas wie dev.example.com zu example.com. Ich würde lieber keinen Konfigurationsaustausch basierend auf Umgebungen durchführen.

Ich verwende v1.18 auf RHEL. Die Proxy-Server sind Angular-Apps, die von ihren jeweiligen Entwicklern verwaltet werden.

server {
  listen 80;
  server_name _;

  index index.html;

  location = /service/a {
    proxy_pass http://svc-a.local/service/a/;
  }
  location /service/a/ {
    proxy_pass http://svc-a.local/service/a/;
  }

  location = /service/b {
    proxy_pass http://svc-b.local/service/b/;
  }
  location /service/b/ {
    proxy_pass http://svc-b.local/service/b/;
  }

  location = /service/x {
    proxy_pass http://svc-x.local/service/x/;
  }
  location /service/x/ {
    proxy_pass http://svc-x.local/service/x/;
  }

  location = /home {
    proxy_pass http://home.local/home/;
  }
  location /home/ {
    proxy_pass http://home.local/home/;
  }

  # kubernetes probes this, but fails getting 301
  location /nginx_status {
    stub_status on;
    acccess_log off;
  }

  # IF NO MATCH FROM ABOVE THEN GO TO /HOME

  # try #1
  return 301 http://$host/home/;

  # try #2
  location = / {
    return 301 http://$host/home/;
  }

  # try #3
  return 301 /home/;

  # try #4
  location = / {
    proxy_pass http://home.local/home/;
  }
}
answer

Außerhalb von Standortblöcken gilt die return 301Regel für den gesamten Serverblock und hat Vorrang vor den Standortblöcken. Sie könnten stattdessen einen Standard-/Fallback-Standortblock definieren, wie in Ihrem Versuch Nr. 2, aber ohne das Gleichheitszeichen ( =). Das Gleichheitszeichen gibt eine genaue Übereinstimmung an, und Sie möchten stattdessen eine Präfixübereinstimmung, damit alle Anforderungen übereinstimmen.

Zum Beispiel:

server {
  listen 80;
  server_name _;

  index index.html;

  location = /service/a {
    proxy_pass http://svc-a.local/service/a/;
  }
  location /service/a/ {
    proxy_pass http://svc-a.local/service/a/;
  }

  location /service/b/ {
    proxy_pass http://svc-b.local/service/b/;
  }

  location = /service/x {
    proxy_pass http://svc-x.local/service/x/;
  }
  location /service/x/ {
    proxy_pass http://svc-x.local/service/x/;
  }

  location = /home {
    proxy_pass http://home.local/home/;
  }
  location /home/ {
    proxy_pass http://home.local/home/;
  }

  # kubernetes probes this, but fails getting 301
  location /nginx_status {
    stub_status on;
    acccess_log off;
  }

  # IF NO MATCH FROM ABOVE THEN GO TO /HOME

  location / {
     return 301 http://$host/home/;
  }
}