ngxin做http强制跳转https,接口的POST请求变成了GET

公司准备将 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;  #查询域名超时时间

原文地址:http://blog.51cto.com/10309478/2089060

时间: 2024-11-08 08:43:49

ngxin做http强制跳转https,接口的POST请求变成了GET的相关文章

一些常见的服务器强制跳转HTTPS 的方法

IIS 版本IIs中实现Http自动转换到Https方法介绍 1.根据IIS版本备份以下文件:IIS6.0 路径:C:\WINDOWS\Help\iisHelp\common\403-4.htm                           IIS7.0以上 路径:C:\inetpub\custerr\zh-CN\403.htm2.把以下内容全部拷贝替换(403-4或403)里面所有内容,保存即可<HTML><HEAD><TITLE>该页必须通过安全通道查看<

宝塔Linux nginx http强制跳转https几种设置方法

最近很多人都比较关注SSL证书的申请与设置,春哥技术博客近期也为大家介绍了国内一些免费SSL证书申请流程及比较常用的VPS建站环境包如何安装配置SSL证书.希望有需要的朋友能成功为自己的站点安装SSL证书.在这里春哥为大家分享几种Nginx环境下强制http转https设置方法. 一.请先找准Nginx配置文件的位置: 其实配置文件位置不是很难找,一般是在/nginx/conf/vhost/目录下,文件命名一般是"你的域名.conf".下面介绍几种常用VPS控制面板Nginx配置文件的

nginx 访问http强制跳转https

server { listen 80; listen [::]:80; server_name www.test; root /home/zrj/www/zhangrenjie_test; index index.php index.html; #这里强制跳转到https rewrite ^(.*) https://$server_name$1 permanent; location / { #try_files $uri $uri/ =404; try_files $uri $uri/ /in

nginx http301强制跳转https、域名跳转到带www

http强制跳转到https在nginx配置文件添加:if ($scheme = http) {return 301 https://$server_name$request_uri;} Nginx跳转自动到带www域名规则配置:在nginx大server中添加server{listen 80;listen 443;server_name www.xx.com xx.com;if ($host != 'www.xx.com') {rewrite ^/(.*)$https://www.xx.com

Tomcat配置8080强制跳转https端口变成8443或者80跳转443

Tomcat配置强制https端口变成8443 跳转端口:http默认端口 8080https默认端口 8443 或者 http默认端口 80https默认端口 443这里只讲tomcat配置,至于证书生成请参考其他文档:修改tomcat配置文件 vim /etc/tomcat/server.xml 启用ssl service.xml <Connector port="80" protocol="HTTP/1.1" connectionTimeout=&quo

nginx http强制跳转https

通过nginx的rewrite 进行301永久重定向,参考如下配置即可. server { listen  192.168.1.111:80; server_name test.com; rewrite ^(.*)$  https://$host$1 permanent; } 搭建此虚拟主机完成后,就可以将http://test.com的请求全部重写到https://test.com上了

Nginx强制http跳转https访问

Nginx强制http跳转https访问有以下几个方法 nginx的rewrite方法 可以把所有的HTTP请求通过rewrite重写到HTTPS上 配置 方法一 1 server{ 2 listen 80; 3 server_name XXXXX.com; //你的域名 4 rewrite ^(.*)$ https://XXXXXX.com permanent; 5 location ~ / { 6 index index.html index.php index.htm; 7 } 8 } 方

配置基于主机名的虚拟主机及HTTPD 加密SSL配置以及HTTPS强制跳转

配置基于主机名的虚拟主机   1.先配置DNS DNS 安装 yum install bind* -y 开户防火墙 iptables -A INPUT -p tcp --dport 53 -j ACCEPT iptables -A INPUT -p udp --dport 53 -j ACCEPT iptables -A INPUT -p tcp --sport 53 -j ACCEPT iptables -A INPUT -p udp --sport 53 -j ACCEPT service

http实现自动跳转https的设置方法

Apache 版本 如果需要整站跳转,则在网站的配置文件的<Directory>标签内,键入以下内容: RewriteEngine on RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^(.*)?$ https://%{SERVER_NAME}/$1 [L,R=301] 复制代码 如果对某个目录做https强制跳转,则复制以下代码: RewriteEngine on RewriteBase /yourfolder RewriteCond %{SER