day50 NGINX高级rewrite跳转的介绍和if的用法
day50 nginx 高级rewrite介绍和if的用法
前言
# 我们学习了
1,nginx---基础篇
2,nginx---高级篇
接下来我们将学习-----LNMP的黄金架构
让我们理解linux软件安装的步骤
再次的部署LNMP,实践我的nginx的知识的储备,以及部署的知识点
基于单机的模式部署LNMP (WEB-7)
nginx rewrite跳转
官方网站:
https://nginx.org/en/docs/http/ngx_http_rewrite_module.html
该模块的应用的场景
基于正则表达式的更改请求uri , 返回重定向的uri,返回重定向和条件的配置。
介绍
在实际的工作需求中,我们经常要修改url的请求
- 例如用户默认发送的是http的请求,我们的网站都支持了https部署,需要将用户的http 请求强制跳转到https.
- 网站自适应移动端,或者是pc端,将用户的请求自动的跳转到移动的服务端,或者是pc端
例如
- 这个功能就得通过ngx_http_rewrite_model这个模块来实现
该模块提供的多个指令的功能
break 终端配置
if 请求的判断
set 设置变量
return 设置返回值
rewrite 对用户请求的url进行重写
举个例子
1.用户访问www.360buy > 301永久重定向到新的域名
www.jd.com
并且客户端的浏览器上的域名也自动地发生了变换
1. url 重写的技术 -----> 更改请求的url
http://www.zyk.cn/
自动的跳转到
http://new.yzk.cn/
2. 比如早期的京东的官网,域名叫做 360buy.com
企业进行了域名的修改
jd.com
3. 对于老客户不知道你改名了
他依旧访问360buy.com看到页面无响应以为挂了
就用了淘宝和拼多多
4. 京东就用了rewrite技术,实现让旧的域名的请求,自动的从定向到
新的域名
5. 老客户的浏览器发出请求www.360by.com,浏览器自动地发出一个新的 请求,跳转到新的请求上www.jd.com
rewrite还有那些的功能
1. 实现url的永久的重定向
(1.整个域名的全部替换,比如http跳转到https)
在你学习rewrite之前,先要掌握他的一些基本的逻辑参数,该如何使用。
- break 终端配置
- if 请求判断
- set 设置变量
- return 设置返回值
- rewrite 对用户请求url进行重写
if指令
符号 | 作用 |
---|---|
= | 比较变量,字符串是否相等,相等为true否则false |
!= | 比较变量,字符串是否不相等,不相等为true否则为false |
~ | 区分大小写,匹配正则 |
~* | 不区分大小写,匹配正则 |
#匹配的条件
1. if($remote_addr =ip 地址){
return 403 ; #返回这个状态码,给客户端的响应头里
}
# 比如网站的admin后台管理,禁止用户在公网直接地访问。
2. if($uri~ /admin/){
return 503;
}
1. if语句,用于条件的判断,根据判断的结果不同,执行不同的操作,
if写在server{} , location{}标签里
2. 比如针对用户请求客户端的判断,或者针对用户的ip地址进行判断
基于nginx的内在的变量就可以提取信息
if (匹配的条件){
执行的动作
}
3. 匹配条件:
- nginx的内在的变量
- 使用nginx的if提供条件判断的符号
实际的用法
server {
# 客户端完全匹配到
listen 22555;
server_name localhost;
root html;
charset utf-8;
location /test-if {
# 客户端类型完全匹配到 huawei
if ($http_user_agent = huawei){
echo "agent is huawei";
}
# 客户端类型区分大小写
# 你这里的正则符号,就是一个完全的字符 ,区分大小写的字符串
# Iphone ,你只能传入 Iphone才行
# 基于正则匹配,你得写入正则符号。
if ($http_user_agent ~ Iphone) {
echo "agent is Iphone";
}
# 客户端类型不区分大小写
if ($http_user_agent ~* Chrome) {
echo "agent is Chrome";
}
# 如果请求方法不是GET就提示 ”只能用GET方法,你这个烂玩家“
if ($request_method != GET) {
echo "必须是GET方法,你这个烂玩家";
}
# 如果是IE浏览器,直接提示 "不支持IE,请下载Chrome浏览器"
# 不区分大小写的正则匹配
if ($http_user_agent ~* IE){
echo "不支持IE,请下载Chrome浏览器";
}
# 如果上面没有任何匹配,执行如下语句
echo "if规则没有匹配到";
echo "agent is >>>>>> $http_user_agent";
echo "request_method is >>>>>>>> $request_method";
}
}
测试实际的用法
http 默认的请求方式,如浏览器的访问,curl命令的访问都是get方法,获取资源的意识
[root@master-61 ~]## curl -A 表示传输 user-agent的字符串信息
[root@master-61 ~]#
[root@master-61 ~]#
[root@master-61 ~]#curl 10.0.0.8:22555/test-if
if规则没有匹配到
agent is >>>>>> curl/7.29.0
request_method is >>>>>>>> GET
[root@master-61 ~]#
[root@master-61 ~]#
[root@master-61 ~]#curl -A 'huawei-mate40' 10.0.0.8:22555/test-if
if规则没有匹配到
agent is >>>>>> huawei-mate40
request_method is >>>>>>>> GET
[root@master-61 ~]#curl -A 'Huawei' 10.0.0.8:22555/test-if
if规则没有匹配到
agent is >>>>>> Huawei
request_method is >>>>>>>> GET
[root@master-61 ~]#curl -A 'huawei' 10.0.0.8:22555/test-if
agent is huawei
[root@master-61 ~]##测试区分大小的 Iphone
[root@master-61 ~]#
[root@master-61 ~]#curl -A 'iphone' 10.0.0.8:22555/test-if
if规则没有匹配到
agent is >>>>>> iphone
request_method is >>>>>>>> GET
[root@master-61 ~]#
[root@master-61 ~]#
[root@master-61 ~]#curl -A 'Iphone' 10.0.0.8:22555/test-if
agent is Iphone
[root@master-61 ~]#curl -A 'IPhone' 10.0.0.8:22555/test-if
if规则没有匹配到
agent is >>>>>> IPhone
request_method is >>>>>>>> GET