文章目录

  • 1.Rewrite简介
  • 1.1跳转场景
  • 1.2跳转支持
  • 1.3跳转实现
  • 2.Rewrite命令操作
  • 2.1 flag标记说明
  • 2.2常用正则表达式元字符
  • 3.location匹配
  • 3.1 location分类
  • 3.2正则匹配的常用表达式
  • 3.3location匹配优先级
  • 4.location和rewrite区别
  • 4.1执行顺序
  • 5.需求实例
  • 5.1基于域名的跳转
  • 5.1.1实验效果
  • 5.2基于客户端IP地址
  • 5.2.1实验效果
  • 5.3基于旧、新域名
  • 5.3.1实验效果
  • 5.4基于参数
  • 5.4.1实验效果
  • 5.5基于目录下所有文件
  • 5.5.1实验效果
  • 5.6基于最普通URL
  • 5.6实验效果

1.Rewrite简介

1.1跳转场景

  • URL看起来更规范、合理
  • 企业会将动态URL地址伪装成静态地址提供服务
  • 网址换新域名后,让旧的访问跳转到新的域名上
  • 服务端某些业务调整

1.2跳转支持

ngx_http_rewrite_module模块的支持功能

Nginx:支持URL重写、支持if条件判断,但不支持else
跳转:循环最多可执行10次,超过后nginx将返回500错误
PCRE支持:使用正则表达式用于匹配条件
重写模块set指令:自定义变量以及引用全局变量

实现原理: rewrite使用Nginx全局变量或自己设置的变量,结合正则表达式和标志位实现URL重写以及重定向

1.3跳转实现

Nginx跳转需求的实现方式:
使用rewrite进行匹配跳转
使用if匹配全局变量后跳转
使用location匹配再跳转

rewrite放在server{},if{},location{}段中
location只对域名后边的除去传递参数外的字符串起作用

对域名或参数字符串匹配
使用if全局变量匹配
使用proxy_pass反向代理

2.Rewrite命令操作

rewrite <regex> <replacement> [flag];

ragex:正则表达式,用于匹配条件
replacement:目标,跳转后的内容
flag:rewrite支持的标记

2.1 flag标记说明

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

last和break比较

nginx 带参数url跳转_重定向

2.2常用正则表达式元字符

^:匹配输入字符串的起始位置
 $:匹配输入字符串的结束位置
 *:匹配前面的字符零次或多次
 +:匹配前面的字符一次或多次
 ?:匹配前面的字符零次或一次
 .:匹配除\n之外的任何单个字符
 \:转义符
 \d:匹配纯数字
 {n}:重复n次
 {n,}:重复n次或更多次
 [c]:匹配单个字符c
 [a-z]:匹配a-z小写字母的任意一个
 [a-zA-Z]:匹配a-z小写字母或A-Z大写字母的任意一个

3.location匹配

3.1 location分类

location = patt {}		##精准匹配
location patt {}		##一般匹配
location ~ patt {}		##正则匹配

3.2正则匹配的常用表达式

标记

说明

~

执行一个正则匹配,区分大小写

~*

执行一个正则匹配,不区分大小写

!~

执行一个正则匹配,区分大小写 不匹配

!~*

执行一个正则匹配,不区分大小写不匹配

^~

普通字符匹配;使用前缀匹配。如果匹配成功,则不再匹配其他location

=

普通字符精确匹配。也就是完全匹配

@

定义一个命名的location,使用在内部定向时

3.3location匹配优先级

①:相同类型的表达式,字符串长的会优先匹配
 ②:按优先级排列1. = 类型
2. ^~类型表达式
3. 正则表达式(~和 ~*)类型
4. 常规字符串匹配类型,按前缀匹配
5. 通用匹配(/),如果没有其他匹配,任何请求都会匹配到

4.location和rewrite区别

相同点:都是先跳转
不同点:
rewrite是在同一域名内更改获取资源的路径
location是对一类路径做控制访问或反向代理,还可proxy_pass到其他机器

4.1执行顺序

  1. 执行server块例的rewrite指令
  2. 执行location匹配
  3. 执行选定的location中的rewrite指令

5.需求实例

5.1基于域名的跳转

公司旧域名www.aa.com,因业务需求,需要使用新域名www.bb.com代替
要求:1.不能废除旧域名。2.从旧域名跳转到新域名,保持其参数不变

旧域名主机配置

server {
        listen       80;
        server_name  www.aa.com;
        if ($host = "www.aa.com") {
                rewrite ^/(.*)$ http://www.bb.com/$1 permanent;
        }

        charset utf-8;

        access_log  logs/aa.com.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }
        }

新域名主机配置

server {
                listen  80;
                server_name www.bb.com
                charset utf-8;
                access_log /var/log/nginx/bb.com.access.log main;
        location / {
                root /opt/share/nginx/html;
                index   index.html index.htm;
        }
        }

5.1.1实验效果

当打开www.aa.com时,跳转至www.bb.com,返回301永久重定向状态码

nginx 带参数url跳转_html_02

5.2基于客户端IP地址

因公司业务测试,所有其他IP访问公司网站都显示维护页面,只有公司IP访问正常
主机配置

server {
        listen       80;
        server_name  www.aa.com;
        set $rewrite true;
        if ($remote_addr = "192.168.20.10") {
                set $rewrite false;
                }
        if ($rewrite = true ) {
                rewrite (.+) /error.html;
                }
        charset utf-8;

        access_log  logs/aa.com.access.log  main;

        location / {
            root   html;
            index  index.html index.htm error.html;
        }
		}

5.2.1实验效果

公司IP访问(正常访问公司网页)

nginx 带参数url跳转_正则匹配_03


其他地址访问(公司网页被重定向至维护提醒网页)

nginx 带参数url跳转_nginx_04

5.3基于旧、新域名

将域名www.aa.com下的所有发帖都跳转到www.bb.com/new,且域名跳转后保持参数不变

旧域名主机配置

server {
        listen       80;
        server_name  www.aa.com;
        location /first {
                rewrite (.+) http://www.bb.com/second$1 permanent;
                }

        charset utf-8;

        access_log  logs/aa.com.access.log  main;

        location / {
            root   html;
            index  index.html index.htm ;
        }
}

新域名主机配置

server {
                listen  80;
                server_name www.bb.com
                charset utf-8;
                access_log /var/log/nginx/bb.com.access.log main;
        location / {
                root /opt/share/nginx/html;
                index   index.html index.htm;
        }
        }

5.3.1实验效果

访问www.aa.com/first/1.html被重定向至www.bb.com/second/first/1.html,域名后参数不变,返回301重定向状态码

nginx 带参数url跳转_重定向_05

5.4基于参数

域名后缀参数符合条件的都跳转至网站首页

主机配置

server {
if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {
                rewrite (.*) http://www.aa.com permanent;
        }
        }

5.4.1实验效果

输入符合条件的www.aa.com/100-200-12.html域名后,跳转至首页www.aa.com

nginx 带参数url跳转_正则匹配_06

5.5基于目录下所有文件

让www.aa.com站点下所有目录的文件都跳转至首页

主机配置

server {
location ~* /first/.*.html {
                rewrite (.+) http://www.aa.com;
        }
}

5.5.1实验效果

访问www.aa.com的first目录下所有html文件都跳转至首页

nginx 带参数url跳转_正则匹配_07

5.6基于最普通URL

访问一个具体页面跳转到首页
主机配置

server {
location ~* ^/test/aa.html {
                rewrite (.+) http://www.aa.com permanent;
        }
        }

5.6实验效果

当访问具体地址www.aa.com/test/aa.html时跳转至首页www.aa.com

nginx 带参数url跳转_重定向_08