我在 docker 容器内有一个 Nginx 反向代理,它监听端口 3000 并暴露给 3002:docker run -p "3002:3000" ...
.
这个想法是这个反向代理将代理/my-app
到我的笔记本电脑中在端口 8080 上运行的实例;和/my-app/api
到云实例,在https://my-domain
.
这是配置:
upstream my-laptop {
server host.docker.internal:8080; # this is a magic hostname for the laptop's IP address.
keepalive 64;
}
upstream cloud {
server my-domain.com:443;
keepalive 64;
}
server {
listen 3000;
include ssl/ssl-certs.conf;
include ssl/ssl-params.conf;
location /my-app {
proxy_pass http://my-laptop;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /my-app/api {
proxy_pass https://cloud;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
...
}
问题是:
- 当我击中
https://localhost:3002/my-app
我收到 301 回复/my-app/
(尾部斜杠)。我不知道这是为什么。本地应用程序实例显示在浏览器中,所以我想我可以让它暂时滑动?
- 当我击中
https://localhost:3002/my-app/api/students
,我收到 301 响应https://cloud/my-app/api/students
。当然,这会导致 CORS 问题,并且端点不会返回数据。
现在,我已经配置了几次反向代理,所以我完全震惊了,我没有看到什么问题,这不是我第一次。
我尝试过使用上游 proxy_set_header 与我为不同应用程序使用的另一个反向代理进行比较;我没主意了。
我究竟做错了什么?
尽管提问者的配置没有这个特定问题,但尾随斜杠问题也可能导致重定向而不是代理,如中所述the docs http://nginx.org/en/docs/http/ngx_http_core_module.html#location:
如果位置由以斜杠字符结尾的前缀字符串定义,并且请求由 proxy_pass、fastcgi_pass、uwsgi_pass、scgi_pass、memcached_pass 或 grpc_pass 之一处理,则执行特殊处理。为了响应 URI 等于此字符串但没有尾部斜杠的请求,将返回带有代码 301 的永久重定向到所请求的 URI,并附加斜杠。如果不需要这样做,可以像这样定义 URI 和位置的精确匹配:
location /user/ {
proxy_pass http://user.example.com;
}
location = /user {
proxy_pass http://login.example.com;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)