nginx:将除几个目录之外的所有内容重定向到新主机名

nginx:将除几个目录之外的所有内容重定向到新主机名

我正在通过 nginx 提供 Web 服务(API + Webiste),其规范域名最近发生了更改。API 通过子目录与面向用户的网站分开(例如 /api/ 和 /download/ 是 API 的一部分,其余部分属于网站)。

我现在想将网站部分重定向到新的域名,但在没有重定向的情况下提供 API 请求(以降低服务器负载)。

由于可以通过多个域名访问 Web 服务器,因此我需要重定向所有与新规范不匹配的内容;例如

IF request-domain != new-domain
 AND resource not in (/api/, /download/):
   redirect to new domain

ELSE:
   # serve site
   proxy_pass   http://app_server;

我在 nginx 中没有找到合适的方法来进行(双重)否定比较,而且我无法将它们反转为正向比较,因为备用域名和非 API 资源都很多,我不想在 nginx 配置中维护。

任何想法都将不胜感激!

答案1

在 nginx 中,您通常不想使用 if 来根据 Host 标头或 uri 更改行为。您需要第二台服务器:

server {
  # Make sure this listen matches the one in the second server (minus default flag)
  listen 80;

  server_name new-domain;

  # All your normal processing.  Is it just proxy_pass?
  location / {
    proxy_pass http://app_server;
  }
}

server {
  # If you listen on a specific ip, make sure you put it in the listen here
  # default means it'll catch anything that doesn't match a defined server name
  listen 80 default;

  server_name old-domain; # and everything else, but it's good to define something

  # Everything that doesn't match /api/ or /download/
  location / {
    rewrite ^ http://new-domain$request_uri? permanent;
  }

  # You may want some common proxy_set_header lines here in the server
  # if you need them

  location /api/ {
    proxy_pass http://app_server;
  }

  location /download/ {
    proxy_pass http://app_server;
  }
}

答案2

Nginx 不允许多个或嵌套if语句,但您可以设置变量,如下所示:

    server_name _;

    if ($http_host !~ new-domain) {
        set $var D;
    }
    if ($request_uri !~ (/api|/download)) {
        set $var "${var}U";
    }
    if ($var = DU) {
        rewrite ^(.*)$ http://new-domain$request_uri last;
        break;
    }

关于此else条件,您应该在单独的虚拟主机中执行此操作。

相关内容