前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Ngxin做http强制跳转https后接口的POST请求变成GET

Ngxin做http强制跳转https后接口的POST请求变成GET

作者头像
星哥玩云
发布2022-07-13 14:27:52
1.4K0
发布2022-07-13 14:27:52
举报
文章被收录于专栏:开源部署

公司准备在Ngxin环境将 http 换成 https,就需要 http 强制跳转到 https。这个在网上搜了下,基本总结下

在 server 里面配置 rewrite ^(.*)$  https://$host$1 permanent;

或者在server里面配置 return 301 https://$server_name$request_uri;

或者在server里面配 if,这里指的是需要配置多个域名

if ($host ~* "^wangshibo.com$") {

    rewrite ^/(.*)$ https://dev.wangshibo.com/ permanent;

}

或者在server里面配置  error_page 497  https://$host$uri?$args;

基本就上面这几种方法,网站访问是没问题的,跳转也是ok的

配置成功之后,准备把APP接口的地址也换成https,这就遇到问题了

排查原因发现,首先GET请求是可以收到信息的,POST传参过去是没有信息,我在nginx日志里面配置了$request_body,日志里面发现确实是没有带参数进来,查看日志的前面,POST却变成了GET。找到了问题的关键

通过网上查资料,发现是由于 301引起的。换成307问题解决。

301 Moved Permanently 被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一

307 Temporary Redirect 请求的资源现在临时从不同的URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求

从上面我们可以看出,301跳转是永久重定向,而307是临时重定向。这就是301跳转与307跳转两者之间的区别

上面可能看的不是很懂,简单直白的表述一下区别:

return 307 https://$server_name$request_uri;

307:对于 POST 请求,表示请求还没有被处理,客户端应该向 Location 里的 URI 重新发起 POST 请求

换成 307 状态码即可强制要求不能更改之前的方法。

下面配置80与443共存:

需要配置在一个server里面,443端口后面加ssl。注释掉 ssl on;,具体如下:

server{         listen 80;         listen 443 ssl;         server_name testapp.***.com;         root /data/vhost/test-app;         index index.html index.htm index.shtml index.php;

        #ssl on;         ssl_certificate      /usr/local/nginx/https/***.crt;         ssl_certificate_key  /usr/local/nginx/https/***.key;         ssl_session_timeout  5m;         ssl_protocols TLSv1 TLSv1.1 TLSv1.2;         ssl_ciphers ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!AESGCM;         ssl_prefer_server_ciphers on         ssl_session_cache shared:SSL:10m;         error_page  404    /404.html;

        location ~ [^/]\.php(/|$) {             fastcgi_index index.php;             include fastcgi.conf;             fastcgi_pass  127.0.0.1:9000;             #include        fastcgi_params;             fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;         }       access_log  /data/logs/nginx/access.log  access;       error_log  /data/logs/nginx/error.log  crit; }

两个server的写法:

server{         listen 80;         server_name testapp.***.com;         rewrite ^(.*) https://$server_name$1 permanent; }

server{         listen 443;         server_name testapp.***.com;         root /data/vhost/test-app;         index index.html index.htm index.shtml index.php;

        ssl on;         ssl_certificate      /usr/local/nginx/https/***.crt;         ssl_certificate_key  /usr/local/nginx/https/***.key;         ssl_session_timeout  5m;         ssl_protocols TLSv1 TLSv1.1 TLSv1.2;         ssl_ciphers ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!AESGCM;         ssl_prefer_server_ciphers on         ssl_session_cache shared:SSL:10m;         error_page  404    /404.html;

        location ~ [^/]\.php(/|$) {             fastcgi_index index.php;             include fastcgi.conf;             fastcgi_pass  127.0.0.1:9000;             #include        fastcgi_params;             fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;         }       access_log  /data/logs/nginx/access.log  access;       error_log  /data/logs/nginx/error.log  crit; }

献上ssl优化,以下可以根据业务来使用,不必全部配置,一般配置红色的部分就行了

ssl on; ssl_certificate  /usr/local/https/www.localhost.com.crt; ssl_certificate_key  /usr/local/https/www.localhost.com.key;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;  #只允许TLS协议 ssl_ciphers ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!AESGCM;#加密套件,这里用了CloudFlare's Internet facing SSL cipher configurationssl_prefer_server_ciphers on;  #由服务器协商最佳的加密算法ssl_session_cache builtin:1000 shared:SSL:10m; #Session Cache,将Session缓存到服务器,这可能会占用更多的服务器资源ssl_session_tickets on;  #开启浏览器的Session Ticket缓存ssl_session_timeout 10m;  #SSL session过期时间ssl_stapling on; #OCSP Stapling开启,OCSP是用于在线查询证书吊销情况的服务,使用OCSP Stapling能将证书有效状态的信息缓存到服务器,提高TLS握手速度ssl_stapling_verify on;  #OCSP Stapling验证开启resolver 8.8.8.8 8.8.4.4 valid=300s;  #用于查询OCSP服务器的DNSresolver_timeout 5s;  #查询域名超时时间

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档