NGINX 将所有与 URL 参数匹配的请求重定向到子域

NGINX Redirect All Requests Matching URL with Parameters to Subdomain

我有一个网站也在向主域上的应用程序提供 api 请求。我想将所有匹配的 /api 请求发送到 api 子域。

例如,我希望 https://example.com/api + https://example.com/api/some_action + https://example.com/api/some_action?params1=somevalue&params2=value2... 重定向到相同的 url 结构,但只是在子域上。

所以对于上面的例子:

https://example.com/api -> https://api.example.com/api

https://example.com/api/some_action -> https://api.example.com/api/some_action

https://example.com/api/some_action?params1=somevalue&params2=value2..... -> https://api.example.com/api/some_action?params1=somevalue&params2=value2.....

也适用于所有类型的请求(获取、发布等)。到目前为止,我已经在主域的服务器指令中尝试过这个(在 443 SSL 服务器指令中)

location ~ /api(.*)$ {
  return 301 https://api.example.com/api/$request_uri$is_args$args;
}

我在 https://api.example.com/api/some_action?param1=value ... is https://api.example.com//some_action 上执行一个没有参数且缺少 api 的简单 GET 请求时得到的结果。

要将 example.com/api/foo?bar 重定向到 api.example.com/api/foo?bar,您应该使用:

location ^~ /api {
    return 307 https://api.exemple.com$request_uri;
}

$request_uri变量包含原始请求,包括/api/前缀和查询字符串。

^~ 运算符赋予此 location 优先级(有关更多信息,请参阅 this document for details). The 307 status code maintains GET/POST through the redirection (see this link)。