rewrite重写和https跳转
一、Nginx实现Rewrite重写
Rewrite主要实现url地址重写,以及重定向,就是把传入web的请求重定向到其他url的过程。、
1、Rewrite使用场景
1、地址跳转,用户访问www.nanxi.com这个URL时,将其定向至一个新的域名 m.nanxi.com
2、协议跳转,用户通过http协议请求网站时,将其重新跳转至https协议方式
3、伪静态,将动态页面显示为静态页面方式的一种技术,便于搜索引擎的录入,同时减少动态URL地址对外暴露过多的参数,提升更高的安全性。
4、搜索引擎,SEO优化依赖于url路径,好记的url便于支持搜索引擎录入。
2、Rewrite配置示例
rewrite指令根据表达式来重定向URL,或者修改字符串,可以应用于server,location,if环境下,每行rewrite指令最后跟一个flag标记,支持的flag标记有如下表格所示:
flag | 作用 |
---|---|
last | 本条规则匹配完成后,停止本location匹配,重新以本条结果发请求 |
break | 本条规则匹配完成后,停止本location匹配,直接返回本条请求内容 |
redirect | 返回302临时重定向,地址栏会显示跳转后的地址,每一次访问都会访问源站 |
permanent | 返回301永久重定向,地址栏会显示跳转后的地址,只有第一次访问时是源站 |
注意,直接访问nanxi.com时,会显示403,因为我们没有配置index.html文件。没有添加标记时如下:
当我们在配置中的rewrite后面添加flag标记时显示效果如下:
$args #这个变量等于请求行中的参数。
$content_length #请求头中的Content-length字段。
$content_type #请求头中的Content-Type字段。
$document_root #当前请求在root指令中指定的值。
$host #请求主机头字段,否则为服务器名称。
$http_user_agent #客户端agent信息
$http_cookie #客户端cookie信息
$limit_rate #这个变量可以限制连接速率。
$request_body_file #客户端请求主体信息的临时文件名。
$request_method #客户端请求的动作,通常为GET或POST。
$remote_addr #客户端的IP地址。
$remote_port #客户端的端口。
$remote_user #已经经过Auth Basic Module验证的用户名。
$request_filename #当前请求的文件路径,由root或alias指令与URI请求生成。
$query_string #与$args相同。
$scheme #HTTP方法(如http,https)。
$server_protocol #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr #服务器地址,在完成一次系统调用后可以确定这个值。
$server_name #服务器名称。
$server_port #请求到达服务器的端口号。
$request_uri #包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
$uri #不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
$document_uri #与$uri相同。
$X-Forwarded-For:HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项。标准格式如下:X-Forwarded-For: client1, proxy1, proxy2
二、Ningx HTTPS 实践
为什么需要使用HTTPS,因为HTTP不安全,当我们使用http网站时,会遭到劫持和篡改,如果采用https协议,那么数据在传输过程中是加密的,所以黑客无法窃取或者篡改数据报文信息,同时也避免网站传输时信息泄露,我们现在使用的更多的是TLS加密协议。
1、SSL加密过程
在数据进行加密与解密过程中,如何确定双方的身份,此时就需要有一个权威机构来验证双方身份,那么这个权威机构就是CA机构,CA机构颁发证书的过程如下:
我们申请证书时需要先去登记机构进行身份登记,我是谁,我是什么单位,我是干嘛的,我想做什么,然后登记机构再通过CSR发给CA,CA中心通过后会生成一堆公钥和私钥,公钥会在CA证书链中保存,公钥和私钥证书我们拿到后,会将其部署在WEB服务器上,当浏览器访问我们的https站点时,它会去请求我们的证书,Nginx这样的web服务器会将我们证书的公钥发给浏览器,浏览器会去验证我们的证书是否合法。
详细流程
1、浏览器发起往服务器的443端口发起请求,请求携带了浏览器支持的加密算法和哈希算法。
2、服务器收到请求,选择浏览器支持的加密算法和哈希算法。
3、服务器下将数字证书返回给浏览器,这里的数字证书可以是向某个可靠机构申请的,也可以是自制的。
4、浏览器进入数字证书认证环节,这一部分是浏览器内置的TLS完成的:首先浏览器会从内置的证书列表中索引,找到服务器下发证书对应的机构,如果没有找到,此时就会提示用户该证书是不是由权威机构颁发,是不可信任的。如果查到了对应的机构,则取出该机构颁发的公钥。用机构的证书公钥解密得到证书的内容和证书签名,内容包括网站的网址、网站的公钥、证书的有效期等。浏览器会先验证证书签名的合法性(验证过程类似上面Bob和Susan的通信)。签名通过后,浏览器验证证书记录的网址是否和当前网址是一致的,不一致会提示用户。如果网址一致会检查证书有效期,证书过期了也会提示用户。这些都通过认证时,浏览器就可以安全使用证书中的网站公钥了。浏览器会生成一个随机数R,并使用网站公钥对R进行加密。
5、浏览器将加密的R传送给服务器。
6、服务器用自己的私钥解密得到R。
7、服务器以R为密钥使用了对称加密算法加密网页内容并传输给浏览器。
8、浏览器以R为密钥使用之前约定好的解密算法获取网页内容。
使用HTTP协议模拟网站被篡改
此时我们打开另一台服务器,对192.168.10.200进行劫持,这台服务器等同于代理我们去访问(当然现实过程中我们是不知道的)192.168.10.200这个IP,然后返回给我们的可能是它修改过的内容!
2、SSL证书类型介绍
对比 | 域名型 DV | 企业型 OV | 增强型 EV |
---|---|---|---|
一般用途 | 个人站点和应用; 简单的加密需求 |
电子商务站点和应用; 中小型企业站点 |
大型金融平台; 大型企业和政府机构站点 |
审核内容 | 域名所有权验证 | 全面的企业身份验证; 域名所有权验证 |
最高等级的企业身份验证; 域名所有权验证 |
颁发时长 | 10分钟-24小时 | 3-5个工作日 | 5-7个工作日 |
单次申请年限 | 3个月 | 1-2年 | 1-2年 |
赔付保障金 | —— | 125-175万美金 | 150-175万美金 |
https不支持续费,证书到期需要重新申请并进行替换
https不支持三级域名解析,如 test.m.nanxi.com
https显示绿色,说明整个网站的url都是https保护的
https显示黄色,因为网站代码中包含http的不安全链接
https显示红色,那么证书是假的或者证书过期。
3、Nginx 自签证实现HTTPS
4、Web集群实现HTTPS
注意⚠️ : 证书只配到负载均衡上即可,如果负载均衡配置了https协议,相应的web端也必须支持https协议,否则页面会出现无样式的现象,同样的,如果web设置支持https但是没有使用跳转https,会出现同样的无样式的情况,且访问极慢。(一旦设置支持https协议,那么所有的页面都会按照https的原理运行,默认的http协议将不再被运行!)