Nginx之Rewrite规则
ingress-nginx里面的rewrite注解:
官网链接 https://kubernetes.github.io/ingress-nginx/examples/rewrite/
$1表示路径中正则表达式匹配的第一个()的内容,$2为第二个,以此类推。
在版本0.22.0或更高版本中,需要传递到重写路径的请求URI中的任何子字符串都必须在捕获组中显式定义。第一个组用$1
表示,可以作为rewrite-target的参数。
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: test-ad-admin-vue namespace: default annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/enable-access-log: "false" nginx.ingress.kubernetes.io/rewrite-target: /$2 nginx.ingress.kubernetes.io/use-regex: "true" nginx.ingress.kubernetes.io/configuration-snippet: | rewrite ^/static/(.*)$ /vue/static/$1 redirect; spec: rules: - host: api-ad-beta.wjoyxt.com http: paths: - path: /vue(/|$)(.*) backend: serviceName: nginx-static servicePort: 80 - path: /static backend: serviceName: nginx-static servicePort: 80
使用了rewrite-target注解后,所有path
被强制使用忽略大小写的正则,类似于nginx配置里面的:
location ~* "^/foo/.*" { ... }
spec.rules.host 字段不像nginx一样支持范匹配和正则,必须写完整的域名,
注意:ingress-nginx在将其path作为location块写入nginx模板之前,首先按path的长度降序排序,这个长度里面包含了正则字符。后面就和nginx一样,正则模式下先匹配到的location会直接执行,不往下继续匹配。
IF语句:
http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_rewrite_module.html#if
首先申明nginx只有if语句做判断适应,没有else语句
if语句的常用形式如下:
if(condition){ ... ; }
默认值: —
应用位置: server、location
计算指定的condition的值。如果为真,执行定义在大括号中的指令,并将if指令中的配置指定给请求。if指令会从上一层配置中继承配置。
条件可以是下列任意一种:
变量名;如果变量值为空或者是以"0"开始的字符串,则条件为假; 使用 = 和 != 运算符比较变量和字符串; 使用 ~(大小写敏感)和 ~*(大小写不敏感)运算符匹配变量和正则表达式。正则表达式可以包含匹配组,匹配结果后续可以使用变量$1..$9引用。如果正则表达式中包含字符'}'或者';',整个表达式应该被包含在单引号或双引号的引用中。 使用 -f 和 !-f 运算符检查文件是否存在; 使用 -d 和 !-d 运算符检查目录是否存在; 使用 -e 和 !-e 运算符检查文件、目录或符号链接是否存在; 使用 -x 和 !-x 运算符检查可执行文件;
rewrite语法:
指令语法:rewrite regex replacement[flag];
默认值:none
应用位置:server、location、if
rewrite是实现URL重定向的重要指令,他根据regex(正则表达式)来匹配内容跳转到replacement,结尾是flag标记
简单的小例子:
if ($request_uri ~* "tobd") {
rewrite ^/(.*) http://www.baidu.com/ permanent; # 如果匹配成功后跳转到百度,执行永久301跳转
}
常用正则表达式:
字符 | 描述 |
\ | 将后面接着的字符标记为一个特殊字符或者一个原义字符或一个向后引用 |
^ | 匹配输入字符串的起始位置 |
$ | 匹配输入字符串的结束位置 |
* | 匹配前面的字符零次或者多次 |
+ | 匹配前面字符串一次或者多次 |
? | 匹配前面字符串的零次或者一次 |
. | 匹配除“\n”之外的所有单个字符 |
(pattern) | 匹配括号内的pattern |
rewrite 最后一项flag参数:
标记符号 | 说明 |
last | 本条规则匹配完成后继续向下匹配新的location URI规则 |
break | 本条规则匹配完成后终止,不在匹配任何规则 |
redirect | 返回302临时重定向 |
permanent | 返回301永久重定向 |
1、基础知识点
(1)Rewirte规则也称为 规则重写,主要功能是实现浏览器访问HTTP URL的跳转,其正则表达式是基于Perl语言。
(2)对收缩引擎优化(SEO),利于收索引擎抓取网站页面。
(3)隐藏网站URL真实地址。
(4)网站变更升级,可以基于Rewrite临时重定向到其他页面。
(5)有利于服务器实现伪静态。
2、Rewrite结尾表示符
(1)last:相当于apache里的(L)标记,表示完成rewrite匹配。(浏览器地址栏URL地址不变)
(2)break:本条规则匹配完成后,终止匹配,不再匹配后面的规则。(浏览器地址栏URL地址不变)
(3)redirect:返回302临时重定向,浏览器地址栏会显示跳转后的URL地址。
(4)permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。
3、Rewrite规则常用表达式
(1) . 匹配任何单字符;
(2)? 匹配0到1个字符;只匹配一次;
(3)* 匹配0到多个字符;
(4)+ 匹配1到多个字符;
(5)[0-9] 匹配字符串0-9
(6)[^0-9] 不匹配字符串0-9
(7)^ 字符串开始标志
(8)$ 字符串结束标志
(9)\n 转义换行标志
4、Nginx Rewrite变量常用于匹配HTTP请求头信息、浏览器主机名、URL等。
5、Rewrite配置在nginx的location块中的配置
(1)将dks.net跳转至www.dks.net
if($host='dks.net') { rewrite ^/(.*)$ http://www.dks.net/$1 permanent; }
# $host内置nginx变量,匹配用户访问的域名
# $1表示引用第一个括号的内容,是用户输入的内容;如果不使用$1引用,则只会匹配根
正则匹配的参数,$1表示第一个()内的正则匹配内容,$2为第二个,以此类推
(2)将访问www.dks.net/跳转至www.test.com/new.index.html
rewrite ^/$ http://www.test.com/new.index.html permanent;
(3)访问 /dks/test01/跳转至/newindex.html,浏览器地址不变
rewrite ^/dks/test01/$ /newindex.html last;
(4)多域名跳转 www.dks.net
if($host!='www.dks.net') { rewrite ^/(.*)$ http://www.dks.net/$1 permanert; }
(5)访问文件和目录不存在跳转至index.php
!-f 和 -f 判断文件
!-d 和 -d 判断目录
!-e 和 -e 判断文件和目录
!-x 和 -x 判断文件是否可执行
if(!-e $request filename) { rewrite ^/(.*) /index.php last; }
(6)目录对换 /xxx/123456——> /xxx?id=123456
\d+ 代表匹配数字,相当于[0-9]
rewrite ^/(.+)/(\d+) /$1?id=$2 last;
(7)判断浏览器User Agent跳转
if($http_user_agent ~MSIE) { rewrite ^(.*)$/ie/$1 break; }
(8)禁止访问以.sh | .flv | .mps为文件后缀的文件
location ~.*\.(sh|flv|mp3)$ { return 403; }
(9)将移动用户访问跳动至移动端。
if($http_user_agent ~* "(Android)|(iphone)|(Mobile)|(WAP)|(UCWEB)") { rewrite ^/$ http://m.dks.net/ permanent; }
(10)匹配URL访问字符串跳转
if($args ~* tid=13) { return 404; }
(11)访问/10690/dks/123 跳转至/index.php?tid/10690/items=123
rewrite ^/([0-9]+)/dks/(.+)$ /index.php?tid/$1/items=$2 last;
6、多rewrite规则跳转
rewrite ^/dks/(.*)/$ /newindex.html permanent; #可以跳转 rewrite ^/newindex.html$ /dks/test01/index.html permanent;
rewrite ^/dks/(.*)/$ /newindex.html break; #break 终止跳转,执行下一条rewrite规则 rewrite ^/newindex.html$ /dks/test01/index.html permanent;
rewrite ^/dks/(.*)/$ /newindex.html last; #last 跳转,但下面那条rewrite规则匹配不上,因为last使地址栏url地址不变,所以下面的那条rewrite规则匹配不上;
rewrite ^/newindex.html$ /dks/test01/index.html permanent; #此条规则匹配不上上边的url地址