Nginx反向代理调用API时意外返回307重定向的问题求助
Nginx反向代理调用API时意外返回307重定向的问题求助
我正在给自己开发的应用配置Nginx反向代理,这个应用拆成了两个Docker镜像:
- 一个是Web UI,通过
https://example.com/访问,目前一切正常 - 另一个是后端服务,需要通过
https://example.com/swagger和https://example.com/api访问。其中Swagger页面(比如https://example.com/swagger/index.html)能正常打开,但调用API接口(比如POST请求https://example.com/api/Authentication/login)时,服务器返回307重定向,把请求转到http://actualserver.local:7066/api/Authentication/login,这完全不符合预期——毕竟Swagger能正常工作,搞不懂为啥API会出问题。
下面是我最初使用的nginx.conf配置:
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; } } }
我希望反向代理能直接把请求转发到actualserver.local,而不是返回307,这方面我不太熟悉,求各位大佬帮忙看看问题出在哪。
更新:
我尝试修改了Nginx配置,用upstream来定义后端服务,但问题还是存在,甚至重定向地址变成了https://web-api:7066/api/Authentication/login——整个代码库只有Nginx配置里有web-api这个名称,肯定不是后端应用返回的,应该是Nginx这边的问题。
更新后的配置如下:
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; upstream web-ui { server actualserver.local:3000; } upstream web-api { server actualserver.local:7066; } server { listen 80 default_server; server_name example.com; 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://web-api/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://web-api/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://web-ui; 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; } } }
备注:内容来源于stack exchange,提问作者Colin Dawson
相关产品推荐
相关产品推荐

