nginx rewrite重写

 

 

一 location与rewrite常用的正则表达式

二  location与rewrite的联系和区别

三 location的匹配规则

3.1 location的匹配分类与常用规则

 3.2location 示例说明与规则优先实验

实验1 基于域名的跳转

实验2 基于客户端 IP 访问跳转

 

 

 

 

一 locationrewrite常用的正则表达式

符号 作用

^ 匹配输入字符串的起始位置

$ 匹配输入字符串的结束位置

* 匹配前面的字符零次或多次。如ol*”能匹配“o”及“ol”、“oll

+ 匹配前面的字符一次或多次。如ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o

? 匹配前面的字符零次或一次,例如do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}

. 匹配除\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如“[.\n]”之类的模式

\ 将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如\n”匹配一个换行符,而“\$”则匹配“$

\d 匹配纯数字[0-9]   \s :空白符    \w :任意单词字符包括下划线[A-Za-z0-9_]

{n} 重复 n

{n,} 重复 n 次或更多次

{n,m} 重复 n m

[ ] 定义匹配的字符范围

[c] 匹配单个字符 c

[a-z] 匹配 a-z 小写字母的任意一个

[a-zA-Z0-9] 匹配所有大小写字母或数字

() 表达式的开始和结束位置

| 或运算符

二  locationrewrite的联系和区别

rewrite :对访问的域名或者域名内的URL路径地址重写

location:对访问的路径做访问控制或者代理转发

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

 三 location的匹配规则

3.1 location的匹配分类与常用规则

location 大致可以分为三类:精准匹配" location = / {...} "   ,一般匹配" location / {...} "和正则匹配" location ~ / {...} "。在nginx.conf的配置文件中location默认使用的是通用匹配 "location /{.....}"

 location的匹配规则 规则作用

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

^~ 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其它正则匹配的location

~ 区分大小写的正则匹配。

~* 不区分大小写的正则匹配。

!~ 区分大小写的正则匹配取非。

!~* 不区分大小写的正则匹配取非。

 3.2location 示例说明与规则优先实验

示例一:精准匹配

location = / {

root /var/www/html

 }

 =为精确匹配 / ,主机名后面不能带任何字符串,例如想访问该location制定的匹配网页时,只能访问该主机IP或域名下的"/"(网页也只能存放在/var/www/html/ 下),而像"/abc,/data/test"这一类和location等于号后面路径有任何一点差别的,都不会被匹配到。该匹配方式优先级最高,一旦匹配成功则立即采用

示例二:通用匹配

location / {

root /var/www/html

}

 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求.用户只要是能访问到该主机的IP或域名,即使不输入路径,也能匹配到相关的网页信息。(文件只要是存放在/var/www/html 中,或则更深的目录也能被匹配到。例如:/var/www/html/test/ 下存放网页,用户访问/test 也能够匹配访问到相关网页)该匹配方式为location匹配中优先级最低的方式,只有其他location匹配方式均为成功,才会采用该方式

示例三:一般匹配

#匹配规则a

location /documents/ {

root  /var/www/html

index index.html

}

#匹配规则b

location /documents/abc {

root  /aaa/bbb/ccc

index index.html

}

匹配规则a:匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索其它 location只有其它 location后面的前缀路径没有匹配到时,才会采用这一条

匹配规则b:匹配任何以 /documents/abc 开头的地址,匹配符合以后。还要继续往下搜索其它 location只有其它 location后面的前缀路径没有匹配到时,才会采用这一条

配置设置:

该实验阶段建议实验结束后,将匹配规则a和匹配规则b的上下关系进行调换再实验一次(实验两次,排除优先级是因为上下顺序导致的)

 

实验1 基于域名的跳转

 

 

 过程中有错误,由于最开始的没有建立文件

修改的配置文件内容

server {
listen 80;
server_name www.kgc.com;
charset utf-8;
access_log logs/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.html

会跳转到www.benet.com/test/1.html,查看元素可以看到返回301,实现了永久重定向跳转,而且域名后的参数也正常跳转。

 

实验2 基于客户端 IP 访问跳转

 

 

 

 

 

Rewrite 重写功能

rewrite 的功能介绍

rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL重写以及重定向。

比如:更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求。

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

例如 http://www.yang.com/abc/bbs/index.php?a=1&b=2 只对/abc/bbs/index.php重写。

 rewrite的跳转实现与执行顺序

rewrite跳转实现:

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

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

PCRE支持:perl兼容正则表达式的语法规则匹配

重写模块 set 指令:创建新的变量并设其值

 

 

rewritenginx.conf 中的语法格式

语法格式:rewrite <regex> <replacement> [flag];

 regex :表示正则匹配规则。

replacement :表示跳转后的内容。

flag :表示 rewrite 支持的 flag 标记。

 

 ###flag标记说明###
last :本条规则匹配完成后,不终止重写后的url匹配,一般用在 server 和 if 中。
break :本条规则匹配完成即终止,终止重写后的url匹配,一般使用在 location 中。
redirect :返回302临时重定向,浏览器地址会显示跳转后的URL地址。
permanent :返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。

 

posted @   withfear  阅读(1477)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
----------------------------------- ©著作权归作者所有:来自51CTO博客作者一品堂_技术学习笔记的原创作品,请联系作者获取转载授权,否则将追究法律责任 博客园随笔中添加目录导航悬浮框博客园随笔中添加目录导航悬浮框 https://blog.51cto.com/ios9/3125785
点击右上角即可分享
微信分享提示