在 Nginx 中设置默认重定向

在 Nginx 中设置默认重定向

我需要一种在未定义现有路径时重定向客户端的方法。当我输入返回 301 配置时,nginx 似乎会忽略任何位置配置。它会重定向所有内容。

重定向中的主机名需要是动态的(来自客户端)。这些服务器实际上是容器,部署到 Dev/Prod 环境中。因此客户端 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/;
  }
}

相关内容