Nginx でデフォルトのリダイレクトを設定する

Nginx でデフォルトのリダイレクトを設定する

既存のパスが定義されていない場合にクライアントをリダイレクトする方法が必要です。 return 301 構成を設定すると、nginx は場所の構成を無視するようです。すべてをリダイレクトします。

リダイレクトのホスト名は動的である必要があります (クライアントから取得)。これらのサーバーは実際にはコンテナーであり、開発/運用環境にデプロイされます。そのため、クライアント URL は dev.example.com から example.com などに変わります。環境に基づいて構成を交換することは避けたいです。

私は RHEL で v1.18 を使用しています。プロキシされているサーバーは、それぞれの開発者によって管理されている 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/;
  }
}

答え1

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

関連情報