Nginx - 如果 $request_uri 存在 proxy_pass 一个 url,否则另一个 url

标签 nginx reverse-proxy nginx-reverse-proxy request-uri

我想处理 2 个案例:test.example.comtest.example.com/ABC

  1. 如果输入的 url 是基域 (test.example.com),我想proxy_pass 一个给定的端点(比方说 example .com/home).

  2. 如果给出test.example.com/ABC,我想proxy_passexample.com/confirm/ABC

我让 (1) 像这样工作:

server {
     listen 443 ssl;
     listen [::]:443 ssl;

     server_name test.example.com;

     location / {
         proxy_pass https://example.com/home;
     }
}

但我不知道如何说“如果 $request_uri 存在,proxy_pass 到不同的端点”。我试过:

location / {
    if ($request_uri) {
       proxy_pass https://example.com/confirm/$request_uri;
    }
 
    proxy_pass https://example.com/home;
}

我怎样才能做到这一点?

最佳答案

$request_uri 始终存在并且永远不会为空。域根的 URI 是单个 /(即使它没有显示在浏览器的地址栏中)。

与该 URI 匹配的 location block 是 location =/。参见 this document了解详情。

例如:

location = / {
    proxy_pass https://example.com/home;
}
location / {
    proxy_pass https://example.com/confirm/;
}

第一个 location block 只匹配根 URI /,第二个 location block 匹配任何其他 URI。 URI 的其余部分自动附加到 /confirm/。参见 this document了解详情。

关于Nginx - 如果 $request_uri 存在 proxy_pass 一个 url,否则另一个 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63178511/

相关文章:

django - 被 CORS 策略阻止 - 从 Django 应用程序访问 S3 存储桶

javascript - 如何更正 NginX 反向代理配置中的 Meteor base-url?

amazon-web-services - 在 Nginx 后面的 vpc 中运行的 AWS OpenSearch 不显示租户

php - Laravel 403 无效签名仅在 Nginx Web 服务器上

php - Nginx clean urls,如何将文件夹重写为 try_files 的参数

Apache 反向代理配置更改

Go - ReverseProxy 到 Apache 代理错误 : x509: certificate signed by unknown authority

docker - 如何为多种服务配置NGINX位置

kubernetes-ingress - 使用 Kubernetes NGINX 入口 Controller 后面的相对 URL 托管 web 应用程序

ruby - 我做错了吗还是net/http中的错误?