如何在 http 和 https 中使用 nginx proxy_pass 删除路径?

如何在 http 和 https 中使用 nginx proxy_pass 删除路径?

我已经阅读了下面类似的问题,但遇到了一个问题,该问题稍后会解释:

proxy_pass我有一个类似下面的配置upstream

location /api2/ {
    client_max_body_size 10m;

    if ($scheme = 'https') {
        proxy_pass https://api.example.com;
    }

    if ($scheme = 'http') {
        proxy_pass http://api.example.com;
    }

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
}

此处,该api2部分被发送到上游。在我上面链接的问题中,使用/末尾的来proxy_pass省略该部分。当我在末尾api2添加时,我收到以下错误:/proxy_pass

nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block in /etc/nginx/sites-enabled/mysite:160

当我搜索上述错误时,社区说需要/在proxy_pass中删除才能解决错误。

那么问题是我为什么要进入api2上游?api2代理时我应该如何删除?

当我将配置更改为:

location /api2/ {
    client_max_body_size 10m;

    proxy_pass http://api.example.com/;

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
}

它可以工作,但是https请求在发送请求时有问题。

在上游部分我收到以下错误:

GET //api2/my_endpoint HTTP/1.1" 404

答案1

嗯,问题是,proxy_pass当你没有明确指定要代理的 URI 时,它也不会改变。一点也不。因此,你会得到准确的输入 URI,例如/api2/

如果您需要在代理时篡改 URI,则需要使用rewrite指令。最简单的解决方案是在子句中执行如下操作location

rewrite ^/api2/(.*) /$1 break;

另外,使用两种不同方案代理到同一个 URL 看起来也并不多余。我认为你应该终止代理上的 TLS,或者,如果中间传输是受攻击的对象,则摆脱纯 HTTP。

相关内容