Nginx的Rewrite和Location配置

目录

一、Rewrite模块

1.功能概述

1.1URL重写

1.2URL重定向 

1.3条件判断 

1.4重写规则的执行顺序 

2.语法格式 

2.1Flag说明 

3. Rewrite跳转实现

4.常用的Nginx正则表达式 

二、Location模块

1.概述

2.分类 

2.1精准匹配(=)

2.2前缀匹配(默认匹配)

2.3优先前缀匹配(^~)

2.4正则匹配(区分大小写~)

2.5正则匹配(不区分大小写~*) 

2.6通配符匹配(/) 

2.7总结

3.location匹配案例

三、Nginx常用网站匹配案例

1.网站根路径的精准匹配

2.静态文件请求的处理 

3.通用规则——动态请求的转发 

4.总结 

四、Rewrite跳转案例

1.基于域名的跳转

2.基于客户端IP访问跳转

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

4.基于参数匹配的跳转 

5.基于目录下所有PHP文件的跳转 

6.基于指定URL请求的跳转 


一、Rewrite模块

1.功能概述

1.1URL重写

基于正则表达式的重写:
使用正则表达式匹配请求的URL,并将其重写为新的URL。常用于修改请求的路径或参数
基于变量的重写:

利用Nginx提供的内置变量(如`$host`、`$request_uri`等)或自定义变量来控制URL的重写

1.2URL重定向 

临时重定向(302 Redirect):
将请求临时重定向到另一个URL。客户端的浏览器会显示新的URL
永久重定向(301 Redirect):
将请求永久重定向到另一个URL。客户端的浏览器会记住并使用新的URL

1.3条件判断 

基于条件的重写:

可以使用 if 指令来添加条件判断,根据请求的不同条件决定是否执行重写

1.4重写规则的执行顺序 

在 server 块中的 rewrite 指令会在匹配到 location 之前执行
location 块中的 rewrite 指令会在匹配到 location 之后执行
在 if 语句中的 rewrite 指令会在 if 条件满足时执行

2.语法格式 

rewrite   [flag];

regex:正则表达式,用于匹配请求的URI
replacement:匹配成功后,新的URI
flag:可选标志,指定重写的行为

2.1Flag说明 

last:本条规则匹配完成后,继续向下匹配新的location URL规则,一般用在 server 和 if 中
break:本条规则匹配完成即终止,不再匹配后面的任何规则,一般使用在 location 中
redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址
permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

3. Rewrite跳转实现

Nginx:

通过ngx_http_rewrite_module 模块支持URL重写、支持if条件判断,但不支持else
跳转:

从一个 location跳转到另一个location,循环最多可以执行10次,超过后nginx将返回500错误
PCRE支持:

perl兼容正则表达式的语法规则匹配
重写模块set指令:

创建新的变量并设其值

Nginx的Rewrite和Location配置_第1张图片

4.常用的Nginx正则表达式 

符号 说明 示例
^ 匹配输入字符串的起始位置 ^abc 匹配 abcdef,但不匹配 habc
$ 匹配输入字符串的结束位置 abc$ 匹配 xyzabc,但不匹配 abcxyz
* 匹配前面的字符零次或多次 lo* 匹配 l、lo、loo 等
+ 匹配前面的字符一次或多次 lo+l 匹配 l、lol、lool 等
? 匹配前面的字符零次或一次 colou?r 匹配 color 或 colour
. 匹配除“\n”之外的任何单个字符 a.b 匹配 acb、adb 等
\ 将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用 \$ 匹配 $,\\ 匹配 \
\d 匹配纯数字 \d{3} 匹配 123、456 等
{n} 重复前面的字符 n 次 a{3} 匹配 aaa
{n,} 重复前面的字符 n 次或更多次 a{2,} 匹配 aa、aaa、aaaa 等
{n,m} 重复前面的字符 n 到 m 次 a{2,4} 匹配 aa、aaa、aaaa
[ ] 定义匹配的字符范围 [a-z] 匹配小写字母
[c] 匹配单个字符 c [a] 匹配 a
[a-z] 匹配 a-z 小写字母的任意一个 [a-z] 匹配任意小写字母
[a-zA-Z0-9] 匹配所有大小写字母或数字 [a-zA-Z0-9] 匹配任意字母或数字
() 表达式的开始和结束位置 (abc)+ 匹配 abcbac、abcabcabc 等
| 或运算符 匹配 aa|bb|cc 三个中的一个

二、Location模块

1.概述

在Nginx配置中,location指令用于定义 URL 匹配规则,并为匹配的请求指定不同的处理方式location块可以用来设置不同的处理逻辑,比如重写请求、代理请求、指定根目录、添加额外的头部等

2.分类 

2.1精准匹配(=)

匹配方式:要求请求的 URI 必须与 location 指定的路径完全匹配
优先级:优先级最高,匹配到后不再进行其他匹配

2.2前缀匹配(默认匹配)

匹配方式:匹配 URI 的前缀。Nginx 默认使用这种方式进行匹配
优先级:如果有多个前缀匹配,Nginx 会选择最长的那个

2.3优先前缀匹配(^~)

匹配方式:如果使用 ^~前缀,则表示该路径是优先前缀匹配,即如果匹配到了这个
location,则不再进行正则匹配
优先级:高于正则匹配,低于精确匹配

2.4正则匹配(区分大小写~)

匹配方式:使用正则表达式进行匹配,区分大小写
优先级:低于 ^~ 和精确匹配,高于默认的前缀匹配

2.5正则匹配(不区分大小写~*) 

匹配方式:使用正则表达式进行匹配,不区分大小写
优先级:与区分大小写的正则匹配相同,但适用于大小写不敏感的匹配

2.6通配符匹配(/) 

匹配方式:这是一个通用的前缀匹配,用来匹配所有请求。在其他location都没有匹配时作为兜底使用
优先级:最低

2.7总结

location 匹配的先后顺序
首先看优先级:精确>前缀>正则>一般>通用
优先级相同

正则看上下顺序,上面的优先;

一般匹配看长度,最长匹配的优先;
精确、前缀、正则、一般都没有匹配到,最后再看通用匹配

3.location匹配案例

(1)location = /         http://www.kgc.com/        

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

 (2)location / {}        http://www.kgc.com/data  http://www.kgc.com/data/abc     /a/usr/local/nginx/html/data/abc  
因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 比如访问 / 和 /data, 则 / 匹配, /data 也匹配,但若后面是正则表达式会和最长字符串优先匹配(最长匹配)

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

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

三、Nginx常用网站匹配案例

1.网站根路径的精准匹配

这是必选规则,用于处理直接访问网站首页的请求。由于通过域名访问网站首页非常频繁采用这种配置可以加速首页的处理。首页可以是一个静态页面,也可以直接转发给后端应用服务器

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

用途:加速首页加载,提高用户访问速度
配置:将请求定向到静态文件或后端应用服务器

2.静态文件请求的处理 

这是Nginx作为HTTP服务器的强项,用于高效地处理静态文件请求。可以通过目录匹配或后缀匹配。两种模式进行配置,也可以搭配使用

目录匹配

location ^~ /static/ {
    root /webroot/static/;
}

用途:处理存放在 /static/ 目录中的静态文件,如图片、样式表、脚本等 

后缀匹配

location ~* \.(html|gif|jpg|jpeg|png|css|js|ico)$ {
    root /webroot/res/;
}

用途:通过文件后缀匹配处理特定类型的静态文件,如图片、HTML文件、CSS 文件等
配置:匹配所有符合特定后缀的文件请求,确保这些文件的高效处理

3.通用规则——动态请求的转发 

此规则用于处理所有非静态文件的请求,默认将这些请求视为动态请求,并将其转发到后端应用服务器处理

location / {
    proxy_pass http://tomcat_server;
}

用途:将所有未被其他location规则匹配的请求转发给后端服务器(如 Tomcat)处理,适用于php、jsp等动态请求
配置:通过反向代理将请求转发到指定的后端应用服务器

4.总结 

精确匹配网站根路径:加速首页访问
静态文件匹配:提高静态资源的加载效率
通用规则:将动态请求转发给后端服务器处理

四、Rewrite跳转案例

1.基于域名的跳转

需求:将旧域名www.kgc.com跳转到www.benet.com,并保留URL参数

vim /usr/local/nginx/conf/nginx.conf

server {
    listen       80;
    server_name  www.kgc.com;
    charset utf-8;
    access_log  /var/log/nginx/www.kgc.com-access.log;

    location / {
        # 域名重定向
        if ($host = 'www.kgc.com') {
            rewrite ^/(.*)$ http://www.benet.com/$1 permanent;
        }
        root   html;
        index  index.html index.htm;
    }
}

效果:浏览器访问 http://www.kgc.com/test/1.htm1 将会跳转到http://www.benet.com/test/1.htm1,并返回 301 状态码,表明永久重定向成功

2.基于客户端IP访问跳转

需求:所有访问都显示维护页面,只有IP 为172.16.58.10的客户端可以正常访问

vim /usr/local/nginx/conf/nginx.conf

server {
    listen       80;
    server_name  www.kgc.com;
    charset utf-8;
    access_log  /var/log/nginx/www.kgc.com-access.log;

    # 设置是否合法IP的标记
    set $rewrite true;
    if ($remote_addr = "172.16.58.10") {
        set $rewrite false;
    }

    # 非法IP跳转到维护页面
    if ($rewrite = true) {
        rewrite (.+) /weihu.html;
    }

    location = /weihu.html {
        root /var/www/html;
    }

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

效果:除IP为172.16.58.10外的所有访问都将被重定向到 /weihu.html 页面

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

需求:将访问 http://bbs.kgc.com/post/ 跳转到 http://www.kgc.com/bbs/post/

vim /usr/local/nginx/conf/nginx.conf

server {
    listen       80;
    server_name  bbs.kgc.com;
    charset utf-8;
    access_log  /var/log/nginx/www.kgc.com-access.log;

    location /post {
        rewrite (.+) http://www.kgc.com/bbs$1 permanent;
    }

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

效果:访问 http://bbs.kgc.com/post/1.htm1 将会跳转到 http://www.kgc.com/bbs/post/1.html

4.基于参数匹配的跳转 

需求:访问 http://www.kgc.com/100-(100|208)-100.htm1时,跳转到 http://ww.kgc.com首页

vim /usr/local/nginx/conf/nginx.conf

server {
    listen       80;
    server_name  www.kgc.com;
    charset utf-8;
    access_log  /var/log/nginx/www.kgc.com-access.log;

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

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

效果:访问 http://www.kgc.com/100-200-100,htm1或http://www.kgc.com/100-100-100.html都会跳转到 http://www.kgc.com

5.基于目录下所有PHP文件的跳转 

需求:访问http://www.kgc.com/upload/123.php时,跳转到http://www.kgc.com首页

vim /usr/local/nginx/conf/nginx.conf

server {
    listen       80;
    server_name  www.kgc.com;
    charset utf-8;
    access_log  /var/log/nginx/www.kgc.com-access.log;

    location ~* /upload/.*\.php$ {
        rewrite (.+) http://www.kgc.com permanent;
    }

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

效果:访问http://www.kgc.com/upload/123.php将跳转到http://www.kgc.com

6.基于指定URL请求的跳转 

需求:访问http://www,kgc.com/abc/123.html时,跳转到http://www.kgc.com首页

vim /usr/local/nginx/conf/nginx.conf

server {
    listen       80;
    server_name  www.kgc.com;
    charset utf-8;
    access_log  /var/log/nginx/www.kgc.com-access.log;

    location ~* ^/abc/123.html {
        rewrite (.+) http://www.kgc.com permanent;
    }

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

效果:访问http://www.kgc.com/abc/123.htm1将跳转到http://www.kgc.com

你可能感兴趣的:(nginx)