目录
1、常用的nginx正则表达式
^:匹配输入字符串的起始位置
$ :匹配输入字符串的结束位置
* :匹配前面的字符零次或多次。如"ol*"能匹配"o"及"ol"、"oll"”
+:匹配前面的字符一次或多次。如"ol+"能匹配"ol"及"oll"、"olll",但不能匹配"o"
?:匹配前面的字符零次或一次,例如"do(es)?"能匹配"do"或者"does","?"等效于"10,1)”
.:匹配除"\n"之外的任何单个字符,若要匹配包括"\n"在内的任意字符,请使用诸如" [. in]"之类的模式
\:将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如\n"匹配一个换行符,而"\$"则匹配"$"
\d :匹配纯数字
\w :匹配字母或玫字或下划线或汉字
\s :匹配任意的空白符
\b :匹配单词的开始或结束
{n}:重复n 次
{n,} :重复n次或更多次
{n,m} :重复n到m次
[ ]:定义匹配的字符范围
[c] :匹配单个字符c
[a-z]:匹配a-z小写字母的任意一个
[ a-zA-z0-9]:匹配所有大小写字母或数字
() :表达式的开始和结束位置例如:(jpglgif |swf)
l:或运算符
从功能上看rewrite和location似乎有点像,都能实现跳转,主要区别再于rewrite是在同一域,location是对一类路径做控制访问或反向代理,还可以proxy_poss到其他机器。
2、location匹配
(1)location分类
(2)正则匹配的常用表达式
标记 | 说明 |
~ | 执行一个正则匹配,区分大小写 |
~* | 执行一个正则匹配,不区分大小写 |
!~ | 执行一个正则匹配,区分大小写不匹配 |
!~* | 执行一个正则匹配,不区分大小写不匹配 |
^~ | 普通字符匹配,使用前缀匹配,如果匹配成功,则不再匹配其他location |
= | 普通字符精确匹配,也就是完全匹配 |
@ | 定义一个命名的location,使用在内部定向时 |
(3)location的优先级
■相同类型的表达式,字符串唱的会优先匹配
■按优先级排列
●= 类型 (精确匹配)
●^~ 类型表达式(撇皮普通字符,且为前缀匹配)
●正则表达式(~和~*)类型 (是否区分大小写)
●常规字符串匹配类型,按前缀匹配
●通用匹配(/),如果没有其他匹配,任何请求都会匹配到
(4)location精准匹配
1、location = / {}
=为精确匹配/,主机名后面不能带任何字符串,比如访问/和/data,则/匹配,/data 不匹配
再比如 location = /abc,则只匹配/abc,/abc/或/abcd不匹配。若 location /abc ,则即匹配/abc、/ abcd/同时也匹配/abc/。
2、location / {} www.kgc.com/路径
因为所有的地址都以/开头,所以这条规则将匹配到所有请求比如访问/和/data,则/匹配,/data也匹配,但若后面是正则表达式会和最长字符串优先匹配(最长匹配)
3、location /documents/ {}
匹配任何以/documents/开头的地址,匹配符合以后,还要继续往下搜索其它location只有其它location后面的正则表达式没有匹配到时,才会采用这一条
www.kgc.com/documents
www.kgc.com/documents/index
4、location /documents/abc { }
匹配任何以/documents/abc开头的地址,匹配符合以后,还要继续往下搜索其它location只有其它location后面的正则表达式没有匹配到时,才会采用这一条
5、location ^~ /images/ { }
location^~ /abcdef/
匹配任何以/images/开头的地址,匹配符合以后,停止往下搜索正则,采用这一条
6、location ~* \. (gifljpgljpeg)$ { }
匹配所有以gif、 jpg或jpeg结尾的请求
然而,所有请求/images/下的图片会被location ^~ /images/处理,因为~的优先级更高,所以到达不了下一条正则
8、location ~ /images/ abc { }
匹配以/images/abc开头的,优先级次之,只有去掉location ^~ /images/才会采用这一条
9、location /images/abc/1.html { }
匹配/images/abc/1.html文件,如果和正则location ~ /images/abc/1.html相比,正则优先级更高
10、优先级总结(location优先级是怎么排列的):
匹配某个具体文件
(location = 完整路径) >(location ^~完整路径) >(location ~*完整路径) 〉(location~完整路径) >( location完整路径)> ( location/ )
正则表达式:目的是为了尽量精确的匹配
文件:尽量精确匹配,区分大小写 精确、不区分更为精确
目录:尽量精确匹配,区分大小写 精确 优先级更高,不区分大小写的
(5)比较rewrite和location
■相同:都能实现跳转
■不同:
rewrite是在同—域名内更改获取资源的路径
location是对一类路径做控制访问或反向代理,还可以proxy pass到其他机器
执行顺序:执行server块里面的rewrite指令——》执行location匹配——》执行选定location中的rewrite指令
rewrite改写访问的URL路径(被访问的HTML、htm、css文件)
location 对一类地址进行权限控制(认证控制)跳转(跨服务器进行一个URL跳转)
3、Nginx Rewrite
(1)Nginx Rewrite概述
现在 Nginx已经成为很多公司作为前端反向代理(proxy_ pass)服务器的首选,在实际工作中往往会遇到很多跳转(重写URL)的需求。
比如:更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求.如果在后端使用的 Apache服务器,虽然也能做跳转,规则库也很强大,但是用Nginx跳转效率会更高(正则精确匹配)
www. kgc.com/每个星期周四的上午10:00-11:00 会进行维护,在此期间来访问的用户,需要给与客户提供一个"维护中的提示页面www. benet.com/可以是www . kgc.com/weihu.html
##Nginx跳转需求的实现方式
使用rewrite进行匹配跳转(主要匹配的是具体的路径)使用if匹配全局变量后跳转
使用location匹配再跳转(可以匹配后执行proxy_pass,将请求跳转到其他服务上)
nginx跳转需求的实现方式
1、使用rewrite进行匹配跳转(主要匹配的是具体的路径)
2、使用if匹配全局变量后跳转
3、使用location匹配在跳转(可以匹配后执行proxy_pass,将请求跳转到其他服务上)
(2)rewrite跳转场景
1、调整用户浏览的URL,看起来更规范,合乎开发及产品人员的需求。
2、为了让搜索引擎搜寻网站内容及用户体验更好,企业会将动态URL地址伪装成静态地址提供服务。
3、网址换新域名后,让旧的访问跳转到新的域名上。例如,访问京东的 360buy.com会跳转到jd.como4、服务端某些业务调整,比如根据特殊变量、目录、客户端的信息进行URL调整等。
(3)rewrite跳转实现
Nginx:通过ngx_http_rewrite module模块支持URL重写、支持if条件判断,但不支持else
跳转:从一个location跳转到另一个location,循环最多可以执行10次,超过后nginx将返回500错误PCRE支持: perl兼容正则表达式的语法规则匹配
重写模块set指令:创建新的变量并设其值
(4)rewrite功能
rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL重写以及重定向。比如:更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求。
rewrite只能放在server( ),location{ ),if( }中,并且默认只能对域名后边的除去传递的参数外的字符串起作用,例如http://www .dabao. com/a/ we/index.php?id=1&u=str只对/a/we/index.php重写。
(5)rewrite执行顺序如下
(1)执行server模块里面的rewrite 指令。
(2)执行选定的location中的rewrite指令。
(3)执行选定的location中 if中的rewrite指令示例:
http {
server {
rewrite #优先级1
location ~* l. (jpglgif | swf)$ {
rewrite #优先级2
valid_referers none blocked * .dog.com dog.com;
if ( sinvalid_referer ) {
rewrite ^ihttp: / l www .dog.com/ error.png; #优先级3www . dog.com/ rabbit.jpg
rewrite ^l/ http: l /l www . dog. com/ error.png;
4、rewrite基于域名跳转
一、基于域名的跳转
现在公司旧域名www.kgc.com有业务需求变更,需要使用新域名www.benet.com代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变。
添加映射
创建日志目录
mkdir -p /var/log/nginx/conf/nginx.conf
修改配置文件
server
{
listen 80 ;
server_name www.kgc.com;
charset utf-8;
access_log /var/log/nginx/www.kgc.com.log;
location / {
if ($host = 'www.kgc.com') {
rewrite ^/(.*)$ http://ww.benet.com/$1 permanent;
}
root html;
index index.html index.html;
}
error_page 500 502 503 504 /50x.html;
location = /50.html; {
}}
配置完成后重新启动nginx服务
验证:
访问www.kgc.com时跳转www.benet.com网站并
访问www.kgc.com/test.html时跳转www.benet.com网站并显示其跳转路径的内容