- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一台安装了 nginx 的服务器(ubuntu 20.04 内核)。在同一台服务器上,我在端口 8080 上运行着 Spring Boot Web(2.3.3.RELEASE) 服务。
我想从外部访问 Spring Boot Web 服务的资源例如http://server/api/users 访问 http://localhost/api/users 并将该响应返回给客户端。
我在 nginx 中配置了以下规则:
location /api {
proxy_pass http://localhost:8080;
}
这适用于 GET 请求,但不适用于 POST 或 PUT。对客户端的第一个响应是状态代码为 301 的响应:永久移动并根据 HTTP spec客户端应将 HTTP 方法更改为 GET 或 HEAD。客户端在第一次响应后自动更改方法,如/var/log/nginx/access.log 中的 nginx 日志文件所示:
192.168.0.1 - - [14/Oct/2020:11:23:56 +0100] "POST /api/users?key=key HTTP/1.1" 301 162 "-" "PostmanRuntime/7.26.5"
192.168.0.1 - - [14/Oct/2020:11:23:56 +0100] "GET /api/users?key=key HTTP/1.1" 200 93 "http://server/api/users?key=key" "PostmanRuntime/7.26.5"
192.168.0.1 - - [14/Oct/2020:11:23:59 +0100] "PUT /api/users/1/deleted?key=key&deleted=false HTTP/1.1" 301 162 "-" "PostmanRuntime/7.26.5"
192.168.0.1 - - [14/Oct/2020:11:23:59 +0100] "GET /api/users/1/deleted?key=key&deleted=false HTTP/1.1" 405 141 "http://server/api/users/1/deleted?key=key&deleted=false" "PostmanRuntime/7.26.5"
来自 PUT 请求的 GET 请求失败并返回 405,因为路径“/api/users/{id}/deleted”没有映射的 GET。我尝试在“location/api {..}”中添加和修改许多不同的配置,例如:
location /api {
proxy_pass http://localhost:8080;
proxy_redirect http://localhost:8080/ /; # I tried "../api /", ".../api/ /", ".../ /api"
proxy_read_timeout 60s;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
在 serverfault(how do I get nginx to forward HTTP POST requests via rewrite?) 中建议
我在 trac.nginx.com 上发现了完全相同的问题但该配置也不起作用:
location /api { # "/api" and "/api/" doesn't work
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
我目前对我应该尝试让它工作的其他方法感到很迷茫。
--- 编辑:在@ti7 和@ampularius 的帮助下,现在的工作解决方案是:
NGINX 位置条目:
location /api {
proxy_pass http://localhost:8080;
proxy_redirect off;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
}
并且在 Spring Boot 服务的 application.properties 中没有进行任何更改,因此这些设置中的 NONE 对这种情况没有任何作用:
server.use-forward-headers=true
server.forward-headers-strategy=native
server.forward-headers-strategy=framework
server.forward-headers-strategy=none
最佳答案
最近我一直在与优秀的 Gunicorn WSGI server 打交道。使用 nginx 前端。
deploy docs建议使用 proxy_pass
和 Host
header 集禁用 proxy_redirect
,这可能是您遇到问题的根源!
这在处理 POST
和 GET
请求方面效果很好,尽管使用的网络服务器截然不同。
location @proxy_to_app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
# we don't want nginx trying to do something clever with
# redirects, we set the Host: header above already.
proxy_redirect off;
proxy_pass http://app_server;
}
关于rest - 如何将 Nginx 中的 POST/PUT/... 重新路由到内部服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64351360/
我是一名优秀的程序员,十分优秀!