rewrite概述

跳转场景
  1. URL看起来更规范、合理
  2. 企业会将动态URL地址伪装成静态地址提供服务
  3. 网址换新域名后,让旧的访问跳转到新的域名上
  4. 服务端某些业务调整
跳转需求的实现方式

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

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

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

常用正则表达式

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

rewrite语法

rewrite [flag]
flag标记:

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

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

location分类

分类location = patt{} [精准匹配]
location patt {} [一般匹配]
location ~ patt {} [正则匹配]

location优先级

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

location优先级规则

匹配某个具体文件:
(location = 完整路径)> (location ^~ 完整路径) > (location ~* 完整路径) = (location ~ 完整路径) > (location 完整路径) > (location /)
用目录做匹配访问某个文件:
(location = 目录)>(location ^~ 目录)>(location ~* 目录)=(location ~ 目录)>(location /)

rewrite和location区别

相同点:都能实现跳转
不同点:

  1. rewrite是在同一域名内更改获取资源的路径
  2. location是对一类路径控制访问或反向代理,还可以proxy_pass到其他机器

项目实例

1.基于域名的跳转

公司旧域名www.lzw.com,因业务需求,需要使用新域名www.lzwlzw.com代替

vi /usr/local/nginx/conf/nginx.conf
server {
        listen       80;
        server_name  www.lzw.com;
        if ($host = 'www.lzw.com'){                 ##添加重写
        rewrite ^/(.*)$ http://www.lzwlzw.com/$1 permanent;
        }
        charset utf-8;

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

        location / {
            root   html;
            index  index.html index.htm;
        }
}
// 添加新的server
server {
        listen       80;
        server_name  www.lzwlzw.com;
        charset utf-8;
        access_log  /var/log/nginx/www.lzwlzw.com-access.log  main;

        location / {
            root   /usr/share/nginx/html;	// 需要先创建目录和index.html
            index  index.html index.htm;
        }
     }

nginx根据路径跳转其它地址服务器 nginx 跳转_nginx根据路径跳转其它地址服务器

2.基于IP地址

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

server {
        listen       80;
        server_name  www.lzw.com;

        set $rewrite true;
        if ($remote_addr = "20.0.0.15"){
        set $rewrite false;
        }
        if ($rewrite = true){
        rewrite (.+) /index1.html;
        }


        charset utf-8;

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

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

使用公司IP 20.0.0.15访问

nginx根据路径跳转其它地址服务器 nginx 跳转_字符串_02

使用20.0.0.14访问

nginx根据路径跳转其它地址服务器 nginx 跳转_html_03

3.基于旧、新域名跳转并加目录

访问www.lzw.com/aa/a.html跳转到www.lzwlzw.com/second/aa/a.html

vi /usr/local/nginx/conf/nginx.conf
server {
        listen       80;
        server_name  www.lzw.com;

        location /aa {
        rewrite (.+) http://www.lzwlzw.com/second$1 permanent;
        }

        charset utf-8;

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

        location  / {
            root   html;
            index  index.html index.htm;
        }
}
// 添加新的server
server{
         listen  80;
         server_name www.lzwlzw.com
         charset utf-8;
         access_log /var/log/nginx/lzwlzw.com.access.log main;
        location / {
                root /usr/share/nginx/html;
                index   index.html index.htm;
        }
    }

nginx根据路径跳转其它地址服务器 nginx 跳转_nginx根据路径跳转其它地址服务器_04

4.基于参数

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

server {
        listen       80;
        server_name  www.test.com;

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

        charset utf-8;

        access_log  logs/test.com.access.log  main;
}

nginx根据路径跳转其它地址服务器 nginx 跳转_nginx_05

5.基于目录下所有文件

访问www.lzw.com站点下所有目录的文件都跳转至首页

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

访问www.lzw.com/aa/a.html跳转至首页

nginx根据路径跳转其它地址服务器 nginx 跳转_字符串_06

6.基于最普通URL
location ~* ^/aa/a.html {
                rewrite (.+) http://www.lzw.com permanent;
        }

访问www.lzw.com/aa/a.html时跳转至首页

nginx根据路径跳转其它地址服务器 nginx 跳转_nginx_07