第4节. nginx的rewrite模块实现
rewrite
先看下官网的例子,关注下last
这种是服务器内部的跳转,client是看不到的,是没有什么301 302 的,直接就是server内部重定向好了直接给你200的。而不是return你301让你重新去访问一个新的url的。
这点就和return 301 httpxxxx不同了,301是告诉用户重新访问发起的。这个rewrite只server自己内部处理后直接返给用户的。节省了c/s交互吧。
👇echo会抢了rewrite的
反正last不推荐放到location里
👆上图是官网的说法,我反正这么测试👇没看到什么10次循环500code的结果
所以我认为👇
总之:last就是下一个location匹配;break就是不继续匹配了
好像上图的说法也不对,哈哈,原因看下图👇
可能echo优先级高于rewrite吧,所以echo启用后,访问xxx/xxx/test就默认行为重定向301到xxx/xxx/test/然后 echo优先级高,于是直接echo出来了。
而访问xxx/xxx/test/,按理说也是命中location /test,但是此时echo又没有生效!奇怪了
两次现象的区别就是第一次有一个301,而直接访问/test/是没有301的。就这个区别了,所以我认为:
对于last:
/test 301到/test/就会echo优先
/test/ 直接访问echo就会rewrite优先,又或者就是rewrite更希望没有重新向过的行为。
对于break和last一样的逻辑
1、如果存在echo,那么echo就会优先,和last的区别就是 /xxx和/xxx/ 一样都是echo优先了
2、不存在echo,就是常规理解了,就是跳出继续的location匹配了,
我认为,这里写的就是一坨,而且echo是插件,没有弄好一些细节,这块技术落地的时候要测试好你自己的业务场景的。
redirect,http跳转https
第一个301,默认的/xxx跳转/xxx/行为
第二个302 就是conf文件里的redirect导致
curl 里的log要看到框框里的重定向里的完整url需要这么写,要注意request_uri和uri还是有区别的!
比如/xxx/是request_uri,而uri确实/xxx/index.html。
ssl的基于域名进行转发
1、给site2.com创建ssl证书相关的文件
①修改openssl配置文件里的dns为*.site2.com
上图改错了,必须改成*.site2.com才行,否则证书无法验证通过!
好了两个文件有了
配置好虚拟主机,基于域名的
然后就实现了👇
由于上面的site2.com没有写成*.site2.com通配,所以ssl验证失败,这里改一下,顺便用一个ssl证书搞定两个网站
去掉Makefile的xxx.key加密选项和添加v3的dns选项的👇
ssl证书两个虚拟主机就用一个样的
然后看最关键的浏览器
通过sz site.crt导入到本地电脑的桌面上,然后双击导入 受信任的根证书颁发机构 就行了
👆这就实现了一个证书搞定多个域名啦,自然也是一个ip+80对应不同域名的。
据说nginx支持这种ssl的多域名对应一个ip+port是因为TLS SNI功能
TLS SNI就是TLS的sever name indication(sni)
访问错误页面时的处理
需要利用request_filename变量来判断访问的页面不存在
这就实现了访问不存在的网页跳转到首页了,不过要和80转443共存,可能需要这么修改
这是80转443的过程,里面也涉及一个不存在的页面(https://www.site1.com/)这个页面本来是应该存在的啊,奇怪了?这么写把原来的默认/就是访问/index.html的行为给搞没了。
这是不存在页面转的过程👇
奇怪的点看看日志👇