我有一个nginx服务器配置如下:
server {
listen 3000;
listen [::]:3000;
server_name .+;
add_header Strict-Transport-Security "max-age=15552000; includeSubDomains" always;
...
index index.html;
root /usr/share/nginx/html;
location /cam/ {
proxy_pass http://cam:8000/;
}
location /api {
proxy_pass https://some_ip:some_port;
proxy_pass_request_headers on;
proxy_set_header X-API-KEY xxxxx;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $server_name;
proxy_ssl_server_name on;
}
location /share/ {
alias /usr/src/share;
}
location / {
try_files $uri $uri/ /index.html;
}
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' always;
client_max_body_size 1M;
keepalive_timeout 10;
}
对于显示我的前端,这个配置工作正常。凸轮的代理也工作正常。
我在配置API的代理时遇到问题。api在“https://some_ip:some_port”下有一个健全检查,它只返回“200:ok”。否则,我应该能够使用提取请求进行请求,例如
const res = await fetch(`api/subaddress/${system_id.toString()}/base`, {
method: 'POST',
headers: {
'Content-type': 'application/json',
'X-API-KEY': xxxxx,
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'HEAD, GET, POST, PUT, PATCH, DELETE',
'Access-Control-Allow-Headers': 'Origin, Content-Type, X-Auth-Token'
},
body: JSON.stringify(data_body),
});
如果成功,则返回“202:好的”。
如果我使用curl发出这样的请求,它会很好地工作(两个请求),所以API应该不是问题所在。
在当前配置下,我得到一个“200:ok”,它告诉我我已经连接到API,但是代理没有考虑我的子地址。
除了给定的配置之外,我还尝试了以下配置:
location /api {
proxy_pass https://some_ip:some_port$request_uri;
...
}
它总是给我“502:网关错误”
location /api/ {
proxy_pass https://some_ip:some_port/;
...
}
它总是给我“403:禁止”
location /api {
rewrite ^/api/(.*) /$1 break;
proxy_pass https://some_ip:some_port/$1;
...
}
这会导致nginx崩溃,因为它告诉我它无法解析它。我希望避免使用解析器,除非明确必要(我以前也尝试过使用解析器,它也不起作用)。
实现这一目标的正确方法是什么?
1条答案
按热度按时间8yparm6h1#
我解决了这个问题。显然
403: forbidden
是由我的代理的一些配置引起的。删除这些配置后,我再也没有得到那个错误。最后我用
我把它变成了
位于配置文件的顶部。