Nginx 配置 http 强制跳转到 https
个人真实配置
架构:Nginx 反向代理 + Nginx 前端(LNMP)
在 Nginx 反向代理的 虚拟机主机配置文件中,作如下配置:
upstream ilexa_cn { server 192.168.1.100:80; keepalive 50; } server { listen 80; server_name ilexa.cn; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name ilexa.cn; access_log logs/ilexa_cn.log main; proxy_http_version 1.1; proxy_set_header Connection ""; proxy_set_header Connection "keep-alive"; ssl on; ssl_session_timeout 5m; ssl_certificate /etc/nginx/pki/ilexa_cn_bundle.crt; ssl_certificate_key /etc/nginx/pki/ilexa_cn.key; location / { proxy_pass http://ilexa_cn; proxy_set_header Host $host; # needed for HTTPS proxy_set_header X_FORWARDED_PROTO https; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } error_page 497 https://$host$uri?$args; }
【网络资料】Nginx 配置 http 强制跳转到 https
Nginx 的 return 301 跳转
项目的虚拟主机配置文件:
#先监听80端口,为http请求,然后强制转发到https监听的443端口上面 server { listen 80; root /var/www/html/ilexa/; server_name ilexa.cn; return 301 https://$server_name$request_uri; } #监听443端口,https请求 server { listen 443 ssl; root /var/www/html/ilexa/; index index.php index.html index.htm; server_name ilexa.cn; ssl on; ssl_certificate /etc/nginx/pki/ilexa_cn_bundle.crt; ssl_certificate_key /etc/nginx/pki/ilexa_cn.key; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; #按照这个套件配置 ssl_prefer_server_ciphers on; location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS $https if_not_empty; # 网上资料有的这行也不增加 include fastcgi_params; } }
Nginx 的 Rewrite 方法
将所有的 http 请求通过 rewrite 重写到 https 上即可
Nginx前端的配置:
#先监听80端口,为http请求,然后强制转发到https监听的443端口上面 server { listen 80; root /var/www/html/ilexa/; server_name ilexa.cn; rewrite ^(.*) https://$server_name$1 permanent; } #监听443端口,https请求 server { listen 443 ssl; root /var/www/html/ilexa/; server_name ilexa.cn; ssl_certificate /etc/nginx/pki/ilexa_cn_bundle.crt; ssl_certificate_key /etc/nginx/pki/ilexa_cn.key; location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
搭建此虚拟主机完成后,就可以将 http://ilexa.cn 的请求全部重写到 https://ilexa.cn 上了
Nginx 的 497 状态码
497 - normal request was sent to HTTPS
解释:当此虚拟站点只允许https访问时,当用 http 访问时 nginx 会报出497错误码
思路:
利用error_page命令将497状态码的链接重定向到 https://ilexa.cn 这个域名上
配置:
server { listen 192.168.1.100:443; #ssl端口 listen 192.168.1.100:80; #用户习惯用http访问,加上80,后面通过497状态码让它自动跳到443端口 server_name ilexa.cn; ssl on; #为一个server{......}开启ssl支持 ssl_certificate /etc/nginx/ilexa_cn.crt; #指定crt格式的证书文件 ssl_certificate_key /etc/nginx/ilexa_cn.key; #指定crt格式的私钥文件 #让http请求重定向到https请求 error_page 497 https://$host$uri?$args; }
利用 meta 的刷新作用(index.html首页跳转)
以上两种方法均会耗费服务器的资源,我们用 curl 访问baidu.com试一下,看百度的公司是如何实现 baidu.com 向 www.baidu.com 的跳转
可以看到百度很巧妙的利用 meta 的刷新作用,将 baidu.com跳转到www.baidu.com.因此我们可以基于 http://ilexa.cn 的虚拟主机路径下也写一个index.html,内容就是http向https的跳转
index.html 文件内容:
<html> <meta http-equiv="refresh" content="0;url=https://ilexa.cn/"> </html>
nginx 虚拟主机配置:
server { listen 192.168.1.100:80; server_name ilexa.cn; location / { root /srv/www/ilexa/; #index.html放在虚拟主机监听的根目录下 } error_page 404 https://ilexa.cn/; #将404的页面重定向到https的首页 }
Aapache 下 http 强制跳转到 https 的配置
根目录建立 .htaccess 文件。内容如下
RewriteEngine On RewriteCond %{HTTPS} !=on RewriteRule ^(.*) https://%{SERVER_NAME}/$1 [R,L]
当用户在浏览器直接输入域名 ilexa.cn 的时候,这时候域名直接会转向https://ilexa.cn,而且服务器这样配置的效率也蛮高的。
posted on 2020-05-27 16:37 morgan363 阅读(1807) 评论(0) 编辑 收藏 举报