0
点赞
收藏
分享

微信扫一扫

Nginx rewrite

转角一扇门 2022-05-28 阅读 61

1.Nginx常见模块

http

http块是Nginx服务器配置中的重要部分,代理、缓存和日志定义等绝大多数的功能和第三方模块的配置都可以放在这模块中。作用包括:文件引入、MIME-Type定义、日志自定义、是否使用sendfile传输文件、连接超时时间、单连接请求数上限等。

server

server块,虚拟主机(虚拟服务器)。作用:使得Nginx服务器可以在同一台服务器上只要运行一组Nginx进程,就可以运行多个网站。

location

location块是server块的一个指令。作用:基于Nginx服务器接收到的请求字符串,虚拟主机名称(ip,域名)、url匹配,对特定请求进行处理。

2.常用正则表达式

2.1匹配符 表示含义

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

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

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

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

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

. 表示任意一个字符

\转义字符 用于取消特殊符号的含义

\d 匹配纯数字

\s 匹配空的(空格或者制表符)

{n} 匹配前面的子表达式n次

{n,} 匹配前面的子表达式不少于n次

{n,m} 匹配前面的子表达式n到m次

[ ] 匹配括号中的一个字符

[c] 匹配单个字符 c

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

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

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

| 或运算符

2.1location的分类

  • 精准匹配:location = / {}
  • 一般匹配:location / {}
  • 正则匹配:location ~ / {}

2.2location 常用的匹配规则

规则表达式 规则含义

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

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

~ 表示执行一个正则匹配,区分大小写

~* 表示执行一个正匹则配,不区分大小写

!~ 表示执行一个正则匹配,区分大小写不匹配

!~* 表示执行一个正则匹配,不区分大小写不匹配

2.3location优先级排列说明

  1. 首先精确匹配 =
  2. 其次前缀匹配 ^~
  3. 其次是按文件中顺序的正则匹配 ~或~*
  4. 然后匹配不带任何修饰的前缀匹配
  5. 最后是交给 / 通用匹配

2.4 location 示例

(1)精确匹配

 location = / {}

=为精确匹配 / , 主机名后不能携带任何字符串,比如 / 和 /data ,则/匹配,/data不匹配

(2)一般匹配/通用匹配

location / {}

代表以/开头,所以这条规则将匹配所有的请求

location /documents/ {}

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

location /documents/abc {}

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

(3)正则匹配

location ^~ /images/ {}

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

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

匹配所有 gif jpg 或 jepg 结尾的请求

如果 有上面的location ^~ /images/ {}匹配  则会先匹配上一请求,所以到不了这一条。

3.rewrite 示例

3.1基于域名的跳转

现在公司旧域名www.kgc.com有业务需求变更,需要使用新域名www.benet.com代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变。

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

server {

listen       80;

server_name  www.yr.com;  #域名修改  

charset utf-8;

access_log  /var/log/nginx/www.yr.com-access.log;  #日志修改

location / {

#添加域名重定向

       if ($host = 'wwwyr.com'){      #$host为rewrite全局变量,代表请求主机头字段或主机名

  rewrite ^/(.*)$ http://www.zx.com/$1 permanent; #$1为正则匹配的内容,即“域名/”之后的字符串

       }

       root   html;

       index  index.html index.htm;

   }

}

Nginx rewrite_正则匹配

Nginx rewrite_nginx_02

Nginx rewrite_html_03

Nginx rewrite_正则匹配_04

Nginx rewrite_正则匹配_05


3.2基于客户端 IP 访问跳转

今天公司业务新版本上线,要求所有 IP 访问任何内容都显示一个固定维护页面,只有公司 IP :192.168204.130访问正常。

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;       #设置变量$rewrite,变量值为boole值true

   #判断是否为合法IP

if ($remote_addr = "192.168.80.10"){  #当客户端IP为192.168.80.10时,将变量值设为false,不进行重写

       set $rewrite false;

   }

#除了合法IP,其它都是非法IP,进行重写跳转维护页面

   if ($rewrite = true){      #当变量值为true时,进行重写

       rewirte (.+) /weihu.html;    #将域名后边的路径重写成/weihu.html,例如www.kgc.com/weihu.html

   }

   location = /weihu.html {

       root /var/www/html;      #网页返回/var/www/html/weihu.html的内容

   }

 

location / {

       root   html;

       index  index.html index.htm;

   }

}


Nginx rewrite_html_06

Nginx rewrite_html_07

Nginx rewrite_正则匹配_08

浏览器访问,只有ip为192.168.204.130能正常访问,其他地址都是维护面试

Nginx rewrite_html_09

3.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;

#添加

locatoin /post {

       rewirte (.+) http://www.kgc.com/bbs$1 permanent;  #这里的$1为位置变量,代表/post

   }

 

locaiton / {

       root   html;

       index  index.html index.htm;

   }

}

Nginx rewrite_正则匹配_10

Nginx rewrite_nginx_11

使用浏览器访问http:///www.yr.com/post/1.html跳转到yr.com/zx/post/1,html

Nginx rewrite_html_12

3.4基于参数匹配的跳转

现在访问http://www.kgc.com/100-(100|200)-100.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;

 

if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {

       rewrite (.+) http://www.kgc.com permanent;

   }


location / {

       root   html;

       index  index.html index.htm;

   }

}

Nginx rewrite_nginx_13

浏览器访问

http://www.yr.com/100-200-100.html 或http://www.yr.com/100-100-100.html跳转到http://www.yr.com

Nginx rewrite_正则匹配_14

 

3.5基于目录下所有 php 结尾的文件跳转

要求访问 http://www.kgc.com/upload/123.php 跳转到首页。

vim /usr/local/ngnix/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;

   }

locaiton / {

       root   html;

       index  index.html index.htm;

   }

}

Nginx rewrite_正则匹配_15Nginx rewrite_nginx_16

浏览器访问http://www.yr.com/upload/123.php 跳转到http://www.yr.com页面

Nginx rewrite_nginx_17

(6)基于最普通一条 url 请求的跳转

要求访问一个具体的页面如 http://www.kgc.com/abc/123.html 跳转到首页

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 {

       rewirte (.+) http://www.kgc.com permanent;

   }

location / {

       root   html;

       index  index.html index.htm;

   }

}


Nginx rewrite_html_18

Nginx rewrite_正则匹配_19

4.总结

flag规则有以下4个规则:

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

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

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

permanent :返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。

优先级总结:

(location = 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (location /)

举报

相关推荐

0 条评论