Мне нужен способ перенаправления клиентов, когда существующий путь не определен. Когда я ввожу конфигурацию возврата 301, nginx, похоже, игнорирует любые конфигурации местоположения. Он перенаправляет все.

Имя хоста в перенаправлении должно быть динамическим (от клиента). Эти серверы на самом деле являются контейнерами и развертываются в средах Dev/Prod. Таким образом, URL-адрес клиента меняется с чего-то вроде dev.example.com на example.com. Я бы предпочел не менять конфигурацию в зависимости от среды.

Я использую v1.18 на RHEL. Прокси-серверы — это приложения Angular, управляемые соответствующими разработчиками.

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

Правило return 301, находящееся за пределами каких-либо блоков местоположения, будет применяться ко всему блоку сервера и иметь приоритет над блоками местоположения. Вместо этого вы можете определить блок местоположения по умолчанию/резервный вариант, как в вашей попытке № 2, но без знака равенства ( =). Знак равенства указывает точное совпадение, и вместо этого вам нужно совпадение префикса, чтобы оно соответствовало всем запросам.

Например:

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