我正在一个docker容器中部署一个ASP.NETCORE web API。通过提供SSL层的反向代理访问应用程序,并将来自面向互联网的IP的呼叫路由到无法从Web访问的机器。
即
域名-> ReverseProxy -> ASPNetCoreWebApi
代理已经启动并运行,这里是nginx.conf文件,供那些想要查看所有细节的人使用。
我更改了服务器名称,原因显而易见。example.com是面向Internet的域,actualserver.local位于防火墙后面。
worker_processes 1;
events { worker_connections 1024; }
http {
client_max_body_size 0;
sendfile on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
server {
listen 80 default_server;
server_name example.com;
# location /.well-known/acme-challenge/ {
# root /var/www/certbot;
# }
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
server_name example.com;
location /api {
proxy_pass http://actualserver.local:7066/api;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Forwarded-Proto https;
proxy_redirect off;
}
location /swagger {
proxy_pass http://actualserver.local:7066/swagger;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Forwarded-Proto https;
proxy_redirect off;
}
location / {
proxy_pass http://actualserver.local:3000;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Forwarded-Proto https;
proxy_redirect off;
}
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
}
}
webapi应用程序是使用docker-compose部署的,这是文件的相关部分。
API:image:myprivateregistry.com/bcb.api:1.0.0.19 restart:always ports:- 7066:80环境:SQL_SERVER:本地主机MAIL_SERVER:127.0.01
当我浏览到https://example.com时,我从actualserver.local:3000中获取内容,这是一个react应用程序,它工作得很好。
当我浏览到https://example.com/swagger/index.html时,我从我的web应用程序中得到了swagger链接,所以这表明上面的/swagger位置工作得很好,它表明代理正在将请求直接转发到ASP.netcore应用程序。
但是,当我尝试对https://example.com/api/Authentication/login进行rest调用而不是像其他人那样处理调用并发送回响应时,ASP.NETCORE应用程序似乎拦截了该调用并使用http状态307进行响应,从而给出了https://actualserver.local:7066/api/Authentication/login的位置
当然,呼叫失败了。
有谁能告诉我如何阻止ASP.NETCore应用程序尝试重定向调用,并简单地接受请求并处理它,就像我在调试模式下运行而不使用代理一样?
我试过使用swagger、postman和web浏览器。对应用程序中的各种请求进行请求,所有请求都以307结束。
在我的program.cs中我试着添加
builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders =
ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
options.KnownProxies.Add(IPAddress.Parse("1.2.3.4"));
});
var app = builder.Build();
// Configure the HTTP request pipeline.
app.UseForwardedHeaders();
将ipAddresswww.example.com1.2.3.4的IPexample.com,并更改为actualserver.local的IP地址,但没有任何效果
我加了
app.UseHttpLogging();
这似乎没有向Docker日志报告任何东西。
有没有人有任何想法,我可以做什么,以获得从反向代理到web API的请求,实际处理,而不是导致307临时重定向响应?
1条答案
按热度按时间vaqhlq811#
原来根本原因是。。。
这似乎并没有导致任何事情发生在从同一个项目提供的 Swagger 的页面。但是关掉它,嘿,马上,它就起作用了!!!