解决nginx代理转发post请求变get请求方法

请求类型变化原因

当使用 Nginx 将 HTTP 跳转到 HTTPS 时,HTTP 请求可能包含不同类型的方法(method),如 GET、POST、PUT、DELETE 等。根据 HTTP 协议的规定,重定向(Redirection)的方式可能会影响请求方法的保持或者修改。

以下是常见的 Nginx HTTP 跳转 HTTPS 的方式及其对请求方法的影响:

301 Moved Permanently:该方式将所有的 HTTP 请求重定向到 HTTPS 上,并且该重定向是永久性的。客户端在收到 301 响应后,会自动将 HTTP 请求转为 GET 请求,同时将请求地址修改为重定向后的地址。这意味着,如果原始请求是 POST 请求,那么 301 重定向会将其转变为 GET 请求。此外,浏览器会缓存 301 响应,下一次请求时会直接跳转到 HTTPS 上。

302 Found / 303 See Other:这两种方式将所有的 HTTP 请求临时性地重定向到 HTTPS 上。302 Found 的响应会将请求方法保持不变,同时将请求地址修改为重定向后的地址。而 303 See Other 则会将所有请求方法转变为 GET 方法,并将请求地址修改为重定向后的地址。这两种方式都不会缓存响应,下一次请求时会再次发起请求。

307 Temporary Redirect:该方式将所有的 HTTP 请求临时性地重定向到 HTTPS 上,并且会保留原始的请求方法。这意味着,如果原始请求是 POST 请求,那么重定向后的请求仍然是 POST 请求。同时,请求地址也会被修改为重定向后的地址。与 302 Found 类似,307 Temporary Redirect 不会缓存响应,下一次请求时会再次发起请求。

308 Permanent Redirect:该方式将所有的 HTTP 请求重定向到 HTTPS 上,并且该重定向是永久性的。客户端在收到 308 响应后,会自动将 HTTP 请求转为与原始请求方法相同的请求方法,同时将请求地址修改为重定向后的地址。与 301 Moved Permanently 不同的是,308 Permanent Redirect 不会允许浏览器将 POST 请求重定向到新地址。308 响应也会被缓存,下一次请求时会直接跳转到 HTTPS 上。

需要注意的是,不同的重定向方式可能会对请求方法、请求地址、缓存等方面产生不同的影响。因此,在选择重定向方式时,需要根据具体的需求进行选择。通常情况下,推荐使用 301 Moved Permanently 或 308 Permanent Redirect 将 HTTP 重定向到 HTTPS 上,并且需要注意 POST 请求的处理方式。

解决方法

方法1

可以使用return 307进行转发,return 307,对请求类型不做转换,意思就是
get----->get
post----->post
所以通过原样转发可以解决我们post请求会被转化为get请求问题

具体配置方法

server {
    listen 80;
    server_name test.123.com;
	location /test/api {
	      return 307 http://192.168.1.133:8088/api;
	      proxy_set_header Host $host;
      }
 }

这样的话 当我们post test.123.com/test/api这个地址时请求就不会被转化为get请求了

方法2
使用 return 308方式跳转

具体配置方法

server {
    listen 80;
    server_name example.com;
    return 308 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    server_name example.com;
    # HTTPS 相关配置
    ...
}

在k8s ingress中配置http强跳https

在ingress注解中加入以下注解
nginx.ingress.kubernetes.io/force-ssl-redirect true
解决nginx代理转发post请求变get请求方法_第1张图片

扩展

当我们要根据请求类型来过滤按照请求类型转发到指定的地址时可以用以下方式来实现

upstream test123 {
server 192.168.1.133:8888 max_fails=3 fail_timeout=30s;
server {
    listen 80;
    server_name test.123.com;
	location /api/bbb {
	      if ($request_method = POST) {
	         return 307 http://192.168.1.133:8088/aaa/bbb;
	      }  
	     proxy_pass http://test123;
	     proxy_set_header Host $host;
	     }
	 }
}

当我们使用get请求http://test.123.com/api/bbb这个地址时请求不会被转发
当我们使用post请求http://test.123.com/api/bbb这个地址时请求会被转发到http://192.168.1.133:8088/aaa/bbb这个地址

你可能感兴趣的:(nginx)