共计 3513 个字符,预计需要花费 9 分钟才能阅读完成。
公司准备在 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; #查询域名超时时间