理论+实验·nginx里面的rewrite重写模块详解

理论+实验·nginx里面的rewrite重写模块详解

文章目录

  • 理论+实验·nginx里面的rewrite重写模块详解
    • Rewrite模块
        • 一 Rewrite跳转场景
        • 二 Rewrite跳转实现
        • 三 Rewrite实际场景
        • 四 Nginx正则表达式
        • 五 Rewrite命令
    • Location模块
        • 一 location分类
        • 二 location优先级
          • Location优先级的示例
        • 三 location优先级规则
        • 四 比较rewrite和location
    • 安装Nginx服务
    • 实验部分
        • 实验前的准备工作
          • 配置DNS域名解析
          • 安装nginx软件源并安装nginx软件包
        • 一 基于域名跳转
        • 二 基于客户端IP跳转
        • 三 基于旧、新域名跳转并加上目录
        • 四 基于参数匹配的跳转
        • 五 基于所有php文件的跳转
        • 六 基于最普通的一条url请求的跳转,访问一个具体的页面跳转到首页

Rewrite模块

一 Rewrite跳转场景

URL看起来更规范、合理

企业会将动态URL地址伪装成静态地址提供服务

网址换新域名后,让旧的访问跳转到新的域名上

服务端某些业务调整

二 Rewrite跳转实现

ngx_http_rewrite_module 模块

Nginx 支持URL重写、支持if条件判断,但不支持else
跳转 循环最多可以执行10次,超过后nginx将返回500错误
重写模块set指令 set $rewrite true
PCRE支持 支持正则表达式

三 Rewrite实际场景

Nginx跳转需求的实现方式

1 使用rewrite进行匹配跳转

2 使用if匹配全局变量后跳转

3 使用location匹配再跳转

rewrite放在server{}、if{}、location{}段中

1 location只对域名后边的出去传递参数外的字符串起作用

对域名或参数字符串

1 使用if全局变量匹配

2 使用proxy_pass反向代理

四 Nginx正则表达式

常用的正则表达式元字符

字符 说明
^ 匹配输入字符串的起始位置
$ 匹配输入字符串的结束位置
* 匹配前面的字符零次或多次
+ 匹配前面的字符一次或多次
? 匹配前面的字符零次或一次
. 匹配除"\n"之外的任何单个字符===>使用诸如"【.\n】“之类的模式,可匹配包括”\n"在内的任意字符
\ 将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用
\d 匹配纯数字
{n} 重复n次
{n,} 重复n次或更多次
[c] 匹配单个字符c
[a-z] 匹配a-z小写字符的任意一个
[a-zA-Z] 匹配a-z小写字母或A-Z大写字母的任意一个

五 Rewrite命令

Rewrite命令语法

rewrite <正则> <跳转后的内容> [rewrite支持的flag标记];

flag标记说明

标记 说明
last 相当于Apache的[L]标记,表示完成rewrite
break 本条规则匹配完成即终止,不再匹配后面的任何规则
redirect 返回302临时重定向,浏览器地址会显示跳转后的URL地址,爬虫不会更新url
permanent 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址,爬虫更新url

last和break比较

last break
使用场景 一般写在server和if中 一般使用在location中
URL匹配 不终止重写后的url匹配 终止重写后的url匹配

Location模块

一 location分类

分类

1 location = patt {} ===>精准匹配

2 location patt {} ===>一般匹配

3 location ~ patt {} ===>正则匹配

正则匹配的常用表达式

标记 说明
~ 执行一个正则匹配,区分大小写
~* 执行一个正则匹配,不区分大小写
!~ 执行一个正则匹配,区分大小写不匹配
!~* 执行一个正则匹配,不区分大小写不匹配
^~ 普通字符批评日;使用前缀匹配.如果匹配成功,则不再匹配其他location
= 普通字符精确匹配,也就是完全能匹配
@ 定义一个命名的location,使用在内部定向时

二 location优先级

相同类型的表达式,字符串长的会优先匹配

按优先级排列

1 = 类型

2 ^~ 类型表达式

3 正则表达式(*) 类型

4 常规字符串匹配类型,按前缀匹配

5 通用匹配(/),如果没有其它匹配,任何请求都会匹配到

Location优先级的示例
location = / {
	[ configuration A ]
}				精确匹配/,主机名后面不能带任何字符串
location / {
	[ configuration B ]
}				所有的地址都以/开头,这条规则将匹配到所有请求,但正则和最长字符串会优先匹配
location /documents/ {
	[ configuration C ]
}				匹配任何以/docuuments/开头的地址,当后面的正则表达式没有匹配到时,才起作用
location ~ /documents/abc {
	[ configuration D ]
}				匹配任何以/documents/abc开头的地址,当后面的正则表达式没有匹配到时,才会起作用
location ^~ /images/ {
	[ configuration E ]
}				以/images/开头的地址,匹配符合后,停止往下匹配
location ~*\.(gif|jpg|jpeg)$ {
	[ configuration F ]
}				匹配所有以gif,jpg或jpeg结尾的请求,/images/下的图片会被【configuration E】处理,因为^~ 的优先级更高
location /images/abc {
	[ configuration G ]
}				最长字符匹配到/images/abc,优先级最低
location ~ /images/abc {
	[ configuration H ]
}				以/images/abc开头的,优先级次之
location /images/abc/test.html {
	[ configuration I ]
}				如果和正则~ /images/abc/test.html相比,正则优先级更高

三 location优先级规则

匹配某个具体文件

1 (location = 完整路径) > (location ^~ 完整路径) > (location ~* 完整路径) > (location ~ 完整路径)

​ > (location 完整路径) >(location /)

用目录做匹配访问某个文件

2 (location = 目录) > (location ^~ 目录/) > (location ~ 目录) > (location ~* 目录) > (location 目录) > (location /)

四 比较rewrite和location

相同点

1 都能实现跳转

不同点

1 rewrite是在同一个域名内更改获取资源的路径

2 location是对一类路径做控制访问或反向代理,还可以proxy_pass到其他机器

rewrite会卸载location里,执行顺序

1 执行server块里面的rewrite指令

2 执行location匹配

3 执行选定的location中的rewrite指令

安装Nginx服务

步骤

1 安装nginx源

2 安装nginx软件包

3 修改默认站点配置文件: /etc/nginx/conf.d/default.conf

4 启动nginx

注意

1 确定域名可以正常解析

2 做下一个场景前,要删除上一个场景的配置

3 及时清除浏览器缓存

实验部分

实验前的准备工作

配置DNS域名解析

1 www.test.com

2 www.newtest.com

安装nginx软件源并安装nginx软件包
[root@localhost ~]# rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

获取http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
警告:/var/tmp/rpm-tmp.toWY2S: 头V4 RSA/SHA1 Signature, 密钥 ID 7bd9bf62: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:nginx-release-centos-7-0.el7.ngx ################################# [100%]

[root@localhost ~]# yum -y install nginx

一 基于域名跳转

[root@localhost named]# vim /etc/nginx/conf.d/default.conf 
server {
    listen       80;
    server_name  www.test.com;

    #charset koi8-r;
    access_log  /var/log/nginx/host.access.log  main;

    location / {
        if ( $host = "www.test.com" ) {
          rewrite ^/(.*)$ http://www.newtest.com/$1 permanent;
        }
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    } 

理论+实验·nginx里面的rewrite重写模块详解_第1张图片

二 基于客户端IP跳转

[root@localhost ~]# vim /etc/nginx/conf.d/default.conf 
server {
    listen       80;
    server_name  www.test.com;

    #charset koi8-r;
    access_log  /var/log/nginx/host.access.log  main;

    set $rewrite true;
    if ($remote_addr = "20.0.0.101"){
      set $rewrite false;
    }
    if ($rewrite = true){
      rewrite (.+) /error.html;
    }       
    location = /error.html{
      root /usr/share/nginx/html;
    } 
[root@localhost html]# vim /usr/share/nginx/html/error.html

this is error web

理论+实验·nginx里面的rewrite重写模块详解_第2张图片

理论+实验·nginx里面的rewrite重写模块详解_第3张图片

三 基于旧、新域名跳转并加上目录

[root@localhost ~]# vim /etc/nginx/conf.d/default.conf
    location /post {
      rewrite (.+) http://www.test.com/bbs$1 permanent;
     }

理论+实验·nginx里面的rewrite重写模块详解_第4张图片

四 基于参数匹配的跳转

[root@localhost ~]# vim /etc/nginx/conf.d/default.conf 
	if ($request_uri ~ ^/100-(100|200|300)-(\d+).html$) {
	  rewrite (.*) http://www.test.com permanent;
	}

理论+实验·nginx里面的rewrite重写模块详解_第5张图片

五 基于所有php文件的跳转

[root@localhost ~]# vim /etc/nginx/conf.d/default.conf 
	location ~* /upload/.*\.php$ {
	  rewrite (.+) http://www.test.com permanent;
	}

理论+实验·nginx里面的rewrite重写模块详解_第6张图片

六 基于最普通的一条url请求的跳转,访问一个具体的页面跳转到首页

[root@localhost ~]# vim /etc/nginx/conf.d/default.conf 
	location ~* ^/aaa/error.html {
	  rewrite (.+) http://www.test.com permanent;
	}

理论+实验·nginx里面的rewrite重写模块详解_第7张图片

你可能感兴趣的:(企业平台架构)