nginx 代理域名到另外一个域名的实现方法
作者:小果子^_^
nginx 代理域名到另外一个域名
server { listen 80; server_name 原域名; location / { #return 301 http://新域名$request_uri; # 重定向到新域名 proxy_pass http://新域名/; proxy_redirect http://原域名/ http://新域名/; } } server { listen 80; server_name 新域名; # websocket代理 #location /webSocket/chat { # proxy_pass http://xxx.xxx.com/webSocket/chat; # proxy_set_header Host $host; # proxy_set_header Upgrade 'websocket'; # proxy_set_header Connection 'Upgrade'; # proxy_connect_timeout 4s; # proxy_read_timeout 7200s; #两个小时 # proxy_send_timeout 12s; #} location / { proxy_pass http://localhost:8080; root html; index index.html index.htm; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
注意:用return
,可以重定向到新域名的页面,但是请求方法是有问题的
上述代码跑了几天后,不起作用了,又更新了其它代码
server { listen 80; server_name www.old.com; location / { proxy_pass http://www.new.com; proxy_redirect off; } }
上述代码又修改了一下
server { listen 80; server_name www.old.com; location / { proxy_set_header Host www.new.com; return 307 http://www.new.com$request_uri; # 重定向到新域名 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #proxy_redirect http://www.new.com http://www.yyhkjt.com; #rewrite ^(.*)$ http://www.new.com$1 permanent; #rewrite ^(.+)$ $scheme://www.new.com$1 redirect; #return 301 $scheme://www.new.com$request_uri; #proxy_pass http://www.new.com; } }
用postman
请求会将post
请求发送两次
,并且第二次会转为get请求
301:客户端在收到 301 响应后,会自动将 HTTP 请求转为 GET 请求,同时将请求地址修改为重定向后的地址
307:对请求类型不做转换
nginx代理转发post请求变get请求方法
以下是常见的 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
扩展
当我们要根据请求类型来过滤按照请求类型转发到指定的地址时可以用以下方式来实现
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 代理域名到另外一个域名的实现方法的文章就介绍到这了,更多相关nginx 代理域名到另外域名内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!