我已经阅读了下面类似的问题,但遇到了一个问题,该问题稍后会解释:
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。