Nginx 中的重写对 POST 请求不起作用

Nginx 中的重写对 POST 请求不起作用

我有两个 VPS(一个用于故障转移),都运行 Nginx 作为后端服务器的负载均衡器。此外,我在 Nginx 上为我的域名(在 GoDaddy.com 上注册)启用并配置了 SSL。

由于我使用 DNS A 记录来配置 VPS 故障转移的域,因此我无法输入端口号(仅允许 IP 号)。因此,默认情况下域会 ping 到端口 80。但 ssl 侦听端口 443。

为此,我在 nginx 的服务器块中使用了重写方法,但它不适用于 POST 请求。虽然它适用于 GET 请求。我知道 proxy_pass 可以与 POST 请求一起使用,但这不是正确的做法(不安全)。我应该直接在 HTTPS 连接上发布请求。

这是我的 nginx 配置:

upstream tomcat_servers{
    least_conn;
    server 123.45.678.90:8080;
    server 124.345.78.23:8180;
    }

server {
   listen  80;
   server_name thedomain.com;
   rewrite ^(.*) https://$host$request_uri? permanent;
      }


 server {
   listen 443;
   server_name thedomain.com;

....ssl config.....


  location / {
         proxy_pass   http://tomcat_servers;                                                                                   
         proxy_http_version 1.1;
         proxy_connect_timeout 30s;
         proxy_read_timeout 30s;
         proxy_send_timeout 30s;
         proxy_next_upstream timeout;
         proxy_next_upstream error invalid_header http_500 http_502 http_404 http_503 http_504;
  }
 }

我应该如何配置才能使其在给定场景中与 POST 请求一起工作。

谢谢

答案1

您不应使用重定向进行发布。如果必须使用,您应使用 307 代码进行发布。最终用户可能会收到有关重定向的提示。

W3C 规范 - RFC 2616

301 永久移动 如果响应除 GET 或 HEAD 之外的请求而收到 301 状态代码,则用户代理不得自动重定向请求,除非用户可以确认,因为这可能会改变发出请求的条件。

注意:在以下情况下自动重定向 POST 请求: 收到 301 状态代码,一些现有的 HTTP/1.0 用户代理 会错误地将其更改为 GET 请求。

307 临时重定向如果响应除 GET 或 HEAD 之外的请求而收到 307 状态代码,则用户代理不得自动重定向请求,除非用户可以确认,因为这可能会改变发出请求的条件。

也在这里

答案2

您应该修复您的应用程序,以便它仅使用https://domain.com/page//domain.com/page格式化的 URL。

重定向规则仅用于方便用户,以便他们只需输入域名即可首次访问该网站。

答案3

感谢@filmonic 和 Tero 纠正我,因为每个人都说重定向不是 POST 请求的最佳做法,所以我对服务器端网络的架构进行了更改。而且它有效。我的架构现在看起来有点像这样

                         ________________
                        |                |
                        |     CLIENT     |
                        |  WEB BROWSER   |
                        |________________|
                                ||
                                || SSL
                         _______\/_______
                        |                |
                        |   DNS SERVER   |
                        |   (NEW YORK)   |
                        |________________|
                                ||
                                ||
                        _______/  \_______
                       /                  \
                      /  SSL               \ SSL
     ____________________                ____________________
    |                    |              |                    |
    |   SAN FRANCISCO    |              |     NEW YORK       |
    |____________________|              |____________________|
    |   ______________   |              |   ______________   | 
    |  |              |  |              |  |              |  |
    |  |     APP      |  |              |  |     APP      |  |
    |  | LOAD BALANCE |  |              |  | LOAD BALANCE |  |
    |  |     PROXY    |  |              |  |     PROXY    |  |
    |  |_____    _____|  |              |  |_____    _____|  |
    |________|  |________|              |________|  |________|
              ||      __                  __      ||
              ||<=====||==================||=====>||    
              \/      \/                  \/      \/
     ____________________                ____________________
    |                    |              |                    |
    |    SAN FRANCISCO   |              |      NEW YORK      |
    |____________________|              |____________________|
    |   ______________   |              |   ______________   |
    |  |              |  |              |  |              |  |
    |  |  APP SERVERS |  |              |  |  APP SERVERS |  |
    |  |______  ______|  |              |  |______  ______|  |
    |   ______||______   |              |   ______||______   |
    |  |              |  |              |  |              |  |
    |  |   DATABASE   |<==================>|   DATABASE   |  |
    |  |______________|  | MASTER-SLAVE |  |______________|  |
    |____________________|              |____________________|

相关内容