docker - 为什么我的 Nginx 反向代理执行 301 重定向而不是代理?
问题描述
我在 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_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; }
推荐阅读
- c++ - 任务流是否适合构建并行管道?
- python - 如何使用 PyLucene 从 Lucene 8.6.1 索引中获取所有令牌的列表?
- c++ - 使用(4 字节)`int` 和 4 元素 unsigned char 数组表示数字之间是否存在性能差异?
- r - 将动物园对象转换为每周时间序列
- javascript - 如何将活动类设置为变量 - React
- azure-data-factory - 从映射数据流读取时,JSON 中的十进制数被截断
- r - 如何根据另一个 col 的摘要构建变量
- activemq - JBoss 7 Embedded ActiveMQ - MDB 消息侦听器不工作
- apache-spark - 无法解析主 URL:AWS EMR 上的“纱线”
- arrays - Vue 在深度数组中显示更多