Nginx的rewrite模块疑问排查
标题索引
追溯原因
实验分析
原理总结
追踪原因
最近心态"一步一印,有印为证",在Nginx的rewrite模块在工作过程中,客户端发起包到服务器解包整体过程浏览器做了什么?服务器做了什么?到底是服务器端接收请求匹配跳转条件后先执行跳转并将执行结果反馈给客户端呢?还是服务器端接收到请求后先反馈给客户端跳转后的路径,然后客户端再次重新发起请求,服务器端再次接收请求并执行请求,最后将执行结果反馈给客户端?为此决定抓包分析一探究竟。
过程分析
为验证此做四个实验,第一个实验利用rewrite指令进行永久性重定向,抓包分析过程及内容,第二个实验利用rewrite指令临时重定向redirect,抓包分析过程及内容,第三个实验利用rewrite指令后续跟last选项,抓包分析过程及内容,第四个实验利用rewrite指令做http跳转https,,然后分析过程及内容,最后总结rewrite工作原理及过程。
实验环境:一台虚拟服务器、一台普通PC机,虚拟服务器做Nginx服务器,PC机做测试,具体拓扑如下:
图1-1 测试环境拓扑图
实验一:服务器rewrite参数配置为永久性重定向,具体配置如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
[ root@nginxagent conf.d ] #pwd
/etc/nginx/conf .d
[ root@nginxagent conf.d ] mkdir /app/website01/jn
[ root@nginxagent conf.d ] mkdir /app/website01/jncsy
[ root@nginxagent conf.d ] echo jn > /app/website01/jn
[ root@nginxagent conf.d ] echo jncshy > /app/website01/jncsy
[ root@nginxagent conf.d ] #vim virtual.conf
#server test
server {
listen 80;
index index.html;
server_name
root /app/website01/ ;
location /zz {
rewrite ^ /jn/ (.*)$ /jncsy/ $1 permanent;
}
}
|
Client客户端通过浏览器访问www.a.com,IP地址即172.18.27.22,同时在客户端利用Wireshark抓包分析如图:
图1-2 永久性重定抓包分析图
由上图可知,在客户端第一次发起请求http://www.a.com/jn/到达服务器后,服务器对回应301永久性重定向返回新的地址链接,第二次重新发起新的地址请求后,重新获取数据。
实验二:服务器rewrite参数配置为last时,具体如下
1
2
3
4
5
6
7
8
9
10
11
|
[ root@nginxagent conf.d ] #vim virtual.conf
#server test
server {
listen 80;
index index.html;
server_name www.a.com;
root /app/website01/ ;
location /zz {
rewrite ^ /jn/ (.*)$ /jncsy/ $1 last;
}
}
|
Client客户端通过浏览器访问www.a.com,IP地址即172.18.27.22,同时在客户端利用Wireshark抓包分析如图:
图1-3 last重定向工作抓包分析图
当服务器第一次发起请求时,通过http://www.a.com/jn/,请求到达服务器后,服务器内部根据跳转规则直接进行跳转,并将跳转后的最终结果数据反馈给客户端,客户端无需进行第二次请求。
实验三:服务器rewrite参数配置为redirect时,具体如下
1
2
3
4
5
6
7
8
9
10
11
|
[ root@nginxagent conf.d ] #vim virtual.conf
#server test
server {
listen 80;
index index.html;
server_name www.a.com;
root /app/website01/ ;
location /zz {
rewrite ^ /jn/ (.*)$ /jncsy/ $1 redirect;
}
}
|
Client客户端通过浏览器访问www.a.com,IP地址即172.18.27.22,同时在客户端利用Wireshark抓包分析如图:
图1-4 临时重定向工作抓包分析图
由上图可知,在客户端第一次发起请求http://www.a.com/jn/到达服务器后,服务器对回应302临时重定向返回新的地址链接,第二次重新发起新的地址请求后,重新获取数据。
实验四:当服务器配置https,由http跳转至https时,且重定向为redirect,实验如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
[ root@nginxagent ~ ] #mkdir /etc/nginx/ssl
#----------------------------------生成自签名秘钥和证书------------
[ root@nginxagent ~ ] #cd /etc/pki/tls/certs
[ root@nginxser01 certs ] #make nginx.crt
umask 77 ; \
/usr/bin/openssl genrsa -aes128 2048 > nginx.key
Generating RSA private key, 2048 bit long modulus
.........+++
.........................................+++
e is 65537 (0x10001)
Enter pass phrase: #创建私钥,并输入密码#
Verifying - Enter pass phrase: #确认密码#
umask 77 ; \
/usr/bin/openssl req -utf8 -new -key nginx.key -x509 -days 365 -out nginx.crt -set_serial 0
Enter pass phrase for nginx.key: #利用私钥生成证书,输入私钥密码#
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.' , the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:SHANXI
Locality Name (eg, city) [Default City]:XI'AN
Organization Name (eg, company) [Default Company Ltd]:JNCSY
Organizational Unit Name (eg, section) []:OPT
Common Name (eg, your name or your server's hostname ) []:www.a.com
Email Address []:
#-------------------------验证生成的证书和秘钥------------------------------
[ root@nginxser01 certs ] #ll ngi*
-rw------- 1 root root 1289 Oct 28 06:47 nginx.crt
-rw------- 1 root root 1766 Oct 28 06:43 nginx.key
#-------------------------避免每次调用私钥进行输入密码验证进行解密-----------
[ root@nginxser01 certs ] #openssl rsa -in nginx.key -out nginx.key
Enter pass phrase for nginx.key:
writing RSA key
[ root@nginxser01 certs ] #cp ngi* /etc/nginx/ssl
[ root@nginxagent conf.d ] #vim virtual.conf
#server test
server {
listen 80;
index index.html;
server_name www.a.com;
root /app/website01/ ;
location / {
rewrite ^/(.*)$ https: //172 .18.27.22/$1 redirect;
}
server {
listen 443 ssl;
server_name www.a.com;
index index.html;
root /app/website01/ ;
ssl on;
ssl_certificate /etc/nginx/ssl/nginx .crt;
ssl_certificate_key /etc/nginx/ssl/nginx .key;
ssl_session_cache builtin :1000 shared:SSL:20m;
ssl_session_timeout 10m;
}
|
Client客户端通过浏览器访问www.a.com,IP地址即172.18.27.22,同时在客户端利用Wireshark抓包分析如图:
图1-5 http跳转https工作抓包分析图
由上图可知,在客户端第一次发起请求http://www.a.com/jn/到达服务器后,服务器对回应302临时重定向返回新的地址https://www.a.com/jn/,第二次重新发起新的地址请求后,重新获取数据。
总结对比
由此实验总结得知:在临时重定向和永久重定向中,服务器端返回给客户端新的链接,客户端根据服务器端返回的新连接重新发起请求。而rewrite模块的last参数则较为特殊,服务器收到请求后在内部跳转并将跳转执行后的结果直接一次性返回客户端。
本文转自 薛伟博 51CTO博客,原文链接:http://blog.51cto.com/weiboxue/1976905,如需转载请自行联系原作者
Nginx的rewrite模块疑问排查相关推荐
- centos 7.6——Nginx中rewrite模块应用(location)——基于域名的跳转等
centos 7.6--Nginx中rewrite模块应用(location)--基于域名的跳转等 文章目录 centos 7.6--Nginx中rewrite模块应用(location)--基于域名 ...
- NGINX的rewrite模块
NGINX的rewrite模块 4.18 Rewrite 模块 Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求,此功能依靠 PCRE(perlc ...
- nginx 的 rewrite 模块
ngxhttprewrite_module 模块用来使用正则表达式(PCRE)改变请求的 URI,返回重定向,并有条件地选择配置. 指令执行顺序 首先顺序执行 server 块中的 rewrite 模 ...
- nginx安装rewrite模块
Linux nginx安装目录找不到? 如果找不到,那应该就是没有完成安装或者编译: 首先要确认是否正确安装了: make&&makeinstall重新编译一次 其次,在确定安装的目录 ...
- 实例演示Nginx重写(Rewrite)类型last、break、redirect和permanent的区别
本文使用之前制作的Docker容器<<Docker案例:搭建nginx服务>>演示Nginx四种重写类型的区别和效果,如果尚未构建Docker服务可参考之前的文章,或者自建Ng ...
- nginx(三十二)rewrite模块
一 官方rewrite模块 1)这个模块作用于'SERVER_REWRITE'和'REWRITE'阶段,前者的优先级'较高'2)根据rewrite模块出现在'server{}'还是'locati ...
- Nginx极客时间:rewrite阶段的rewrite模块:return指令
1. rewrite模块的return指令: return指令 是由 rewrite模块提供的 一个非常常用的指令,可以在 SERVER_REWRITE 和 REWRITE 这两个阶段生效, 它可以帮 ...
- nginx的rewrite中last和break 及 permanent和redirect的介绍
这里写自定义目录标题 一.last 和 break (1).last 和 break 当出现在location 之外时,两者的作用是一致的没有任何差异. (2).last 和 break 当出现在lo ...
- 1. nginx扩展——ngx_lua 模块简介、安装
1. 简介 lua-nginx-module(ngx_lua module)把 Lua5.1 的解释器 或 LuaJIT 2.0/2.1 的解释器嵌入到 nginx 中,将强大的 Lua 线程(L ...
最新文章
- 区块链以太坊五大开发工具,你喜欢哪个?
- 多路复用 I/O 模型详解, 为什么他能支持更高的并发
- c语言作业指导1,C语言程序设计实验与习题指导
- S3C2440时钟体系
- 致敬那些用键盘改变世界的劳动者
- 立足共赢 | 开宸引领绿色会展经济新形式
- 新手建站虚拟主机与云服务器应该如何选择?
- cad卸载工具_Adobe软件卸载与常见问题解决方案
- 用命令行方式写Android应用
- 【CSDN浏览器助手】这款插件忒好用了
- c语言中dot作用,Unix中的dot命令详解
- Graph Embedding模型【Node2Vec】学习笔记
- 关于C++的数据模型:LP32、ILP32、LLP64、LP64
- 什么是OTDR光时域反射仪,以及其基本工作原理
- 《Java8实战》第11章 用 Optional 取代 null
- 千锋教育python2104期总结day14
- 清爽的空气中流动着一种微熏的温情
- 独立站运营技巧:如何引流?如何提高转化率
- 华为全栈云如沐春风 AI成点睛之笔
- Design下TextInputLayout结合EditText的简单使用
热门文章
- HTML5/CSS3笔记
- python--列表,元组,字符串互相转换
- 通俗易懂的理解 Redux(知乎)
- POJ 2457 BFS
- CentOS搭建SVN记录
- K_Nearest_Neighbot(knn)方法及其Pyhon 实现
- python 只用opencv吗,python – OpenCV:使用solvePnP来确定单应性
- mysql设置显示结果_php 与mysql配置,让页面显示结果
- 快捷键截屏_Windows10自带截屏快捷键使用方法大全
- java为table添加一行_Js实现Table动态添加一行的小例子