zl程序教程

您现在的位置是:首页 >  工具

当前栏目

Nginx:rewrite跳转

Nginx 跳转 Rewrite
2023-09-11 14:17:00 时间

目录

一、常见的Nginx正则表达式

二、location模块

2.1、location可以分为三类

2.2、location常用的匹配规则

2.3、location示例说明

1、location = /{}

2、location /{}

3、location /documents/ {}

4、location /documents/abc {}

5、location ^~ /images/ {}

6、location ~ .(gif|jpg|jpeg)$ {}*

7、location /images/abc {}

8、location ~ /images/abc {}

9、location /images/abc/1.html {}

2.4、location匹配顺序

三、rewrite跳转实现

3.1、语法格式

3.2、rewrite执行顺序

3.3、flag标记说明

3.4、rewrite和location区别

四、rewrite示例

4.1、基于域名的跳转

4.2、rewrite域名镜像

4.3、rewrite独立域名


一、常见的Nginx正则表达式

^ :匹配输入字符串的起始位置
$ :匹配输入字符串的结束位置
* :匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
+ :匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”
? :匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}”
. :匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如“[.\n]”之类的模式
\ :将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配一个换行符,而“\$”则匹配“$”
\d :匹配纯数字
{n} :重复 n 次
{n,} :重复 n 次或更多次
{n,m} :重复 n 到 m 次
[] :定义匹配的字符范围
[c] :匹配单个字符 c
[a-z] :匹配 a-z 小写字母的任意一个
[a-zA-Z0-9] :匹配所有大小写字母或数字
() :表达式的开始和结束位置
| :或运算符

二、location模块

2.1、location可以分为三类

精确匹配:location = / {...}

一般匹配:location = / {...}

正则匹配:location = ~/ {...}

2.2、location常用的匹配规则

=:进行普通字符精确匹配,也就是完全匹配

^~:表示普通字符匹配。适应前缀匹配。如果匹配成功,则不再匹配其他location

~:区分大小写的匹配

~*:不区分大小写的匹配

!~:区分大小写的匹配取非

!~*:不区分大小写的取非

2.3、location示例说明

1、location = /{}

       =为精确匹配/。主机名后面不能带任何字符串,比如访问/和/data/,则/匹配/,/data不匹配,再比如location = /abc,则址匹配/abc,/abc/或/abcd不匹配。若location /abc,则即匹配/abc、/abcd/同时也匹配/abc/。

2、location /{}

        因为所有的地址都以/开头,所有这条规则将匹配到所有请求比如访问/和/data,则/匹配,/data也匹配,单若后面是正则表达式会和最长字符串优先匹配(最长匹配)

3、location /documents/ {}

        匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索其它 location
只有其它 location后面的正则表达式没有匹配到时,才会采用这一条

4、location /documents/abc {}

        匹配任何以 /documents/abc 开头的地址,匹配符合以后,还要继续往下搜索其它 location
只有其它 location后面的正则表达式没有匹配到时,才会采用这一条

5、location ^~ /images/ {}

        匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条

6、location ~ .(gif|jpg|jpeg)$ {}*

        匹配所有以 gif、jpg或jpeg 结尾的请求.然而,所有请求 /images/ 下的图片会被 location ^~ /images/ 处理,因为 ^~ 的优先级更高,所以到达不了这一条正则

7、location /images/abc {}

        最长字符匹配到 /images/abc,优先级最低,继续往下搜索其它 location,会发现 ^~ 和 ~ 存在

8、location ~ /images/abc {}

        匹配以/images/abc 开头的,优先级次之,只有去掉 location ^~ /images/ 才会采用这一条

9、location /images/abc/1.html {}

        匹配/images/abc/1.html 文件,如果和正则location ~ /images/abc/1.html 相比,正则优先级更高

2.4、location匹配顺序

首先看 优先级:精确>前缀>正则>一般>通用
优先级相同:正则看上下顺序,上面的优先;一般匹配看长度,最长匹配的优先
精确、前缀、正则、一般都没有匹配到,最后再看通用匹配

三、rewrite跳转实现

        rewrite功能就是,适应nginx提供的全局变量或自己设置的变量,结合正则表达式和标记为实现URL重写以及重定向。比如:更换域名后需要保持就的域名能跳转到新的域名上、某网页发送改变需要跳转到新的页面、网站防盗链等等需求。

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

3.1、语法格式

rewrite <regex> <replacement> [flag];

regex :表示正则匹配规则。
replacement :表示跳转后的内容。
flag :表示rewrite支持的flag标记。

3.2、rewrite执行顺序

1、执行server里面的rewirite指令

2、执行location匹配

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

3.3、flag标记说明

1、last:本条规则匹配玩成后,继续向后新的location URL规则,一般用在server和if中。

2、break:本条规则匹配完成即终止,不再匹配后面的任何规则,一般使用在location中。

3、redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址

4、permanent:返回301也就重定向,浏览器地址栏会现实跳转后的URL地址

3.4、rewrite和location区别

从功能上看rewrite和location似乎有点相似,都能实现跳转,主要区别在于rewrite是在同一域名内更改获取资源的路径,二location是对一类路径做控制访问或方向代理,还可以proxy_pass到其他机器。

四、rewrite示例

4.1、基于域名的跳转

选择公司就域名www.yyy.com有业务需求变更,需要适应新域名www.zzz.com代替,但是就郁闷不能废除,需要跳转到新域名上,而且后面的参数保持不变。

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

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
        rewrite ^/(.*) http://www.zzz.com/$1 permanent;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
    #gzip  on;

    server {
        listen       80;
        server_name  www.yyy.com; #域名修改     

        #charset koi8-r;

        access_log  /var/log/nginx/www.yyy.access.log; #日志修改

        location / {
            if ($host = 'www.yyy.com'){   #判断域名是否为www.yyy.com
        rewrite ^/(.*) http://www.zzz.com/$1 permanent;   #是的话就对其重定向到www.zzz.com
        }
        root html;
        index index.html;
        }


        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }

 查看就是网址请求的是yyy.com,跳到了zzz.com

4.2、rewrite域名镜像

web项目开发完会部署一个主站中,主站会有很多镜像网站,这样一台挂了其他也可以正常工作

配置:

那么在这里,www.yz.cn就是主域名,www.yz1999.cnwww.yz1025.cn就是镜像网站,

访问主域名(会进行跳转)

访问镜像网站

4.3、rewrite独立域名