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的请求

  1. 例如用户默认发送的是http的请求,我们的网站都支持了https部署,需要将用户的http 请求强制跳转到https.
  2. 网站自适应移动端,或者是pc端,将用户的请求自动的跳转到移动的服务端,或者是pc端

例如

http://yuchaoic.cn PC端

http://m.yuchaoit.cn 手机端

  1. 这个功能就得通过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之前,先要掌握他的一些基本的逻辑参数,该如何使用。

  1. break 终端配置
  2. if 请求判断
  3. set 设置变量
  4. return 设置返回值
  5. 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

posted @ 2025-04-19 22:29  国家一级冲浪yzk  阅读(9)  评论(0)    收藏  举报