=:精确匹配(必须全部相等)
~:大小写敏感(正则表达式)
~* :忽略大小写(正则表达式),这里要注意忽略大小写的意思是请求的字符大小写都可以,但是不会进行大小转换,请求的大小写对应的文件必须存在。
^~ :只需匹配uri部分
@ :内部服务跳转
[root@localhost ~]# curl 192.168.202.132/jf.jpg
this is /jf.jpg
因为此时只有一个匹配规则,所以输出此匹配规则的输出值
[root@localhost ~]# curl 192.168.202.132/jf.jpg
this is ~ \.(jpg|png)
此时可以看到直接跳过第一个规则匹配到第二个规则
[root@localhost ~]# curl 192.168.202.132/jf.jpg
this is ~ \.(jpg|png)
[root@localhost ~]# curl 192.168.202.132/jf.JPG
this is ~* \.(jpg|png)
以上两种不同方式访问匹配到不同规则
[root@localhost ~]# curl 192.168.202.132/image/jf.jpg
this is ^~ /image/jf.jpg
以上直接跳过前面三个规则匹配第四个规则
[root@localhost ~]# curl 192.168.202.132/image/jf.jpg
this is = /image/jf.jpg
直接匹配到第五个规则
那么按照匹配规则顺序应该是这样的:
第一步:取出uri:/image/jf.jpg
第二步:去匹配localtion规则,查找有没有 = /image/jf.jpg 的规则,有则停止匹配
第三步:将location = /image/jf.jpg 规则注释,继续查找有没有 ^~ /image/ 的规则
第四步:将 location ^~ /image/注释,这是它会去查找有没有正则匹配规则
第五步:其他的都注释后,因为优先匹配规则都没有找到,最后匹配到 /image/规则
注意:其中,第二个和的第三个规则都是正则,这时会按照至上而下的顺序匹配
flag标记说明:
last #本条规则匹配完成终止当前location的规则,继续向下匹配新的location URI规则
break #本条规则匹配完成即终止,不再匹配后面的任何规则
redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址,关闭服务,无法重定向。
permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址,关闭服务,依然可以重定向,清除缓存失效。
[root@localhost ~]# echo "this is test page" > /usr/local/nginx/html/test.html
[root@localhost ~]# echo "this is test1 page" > /usr/local/nginx/html/test1.html
[root@localhost ~]# echo "this is test2 page" > /usr/local/nginx/html/test2.html
[root@localhost ~]# echo "this is test3 page" > /usr/local/nginx/html/test3.html
(1)没加rewrite规则访问主页
[root@localhost ~]# curl 192.168.202.132
test access page
[root@localhost ~]# curl 192.168.202.132
this is test page
此时已经重定向到test.html,所以输出为其内容
[root@localhost ~]# curl 192.168.202.132
this is test1 page
由上可知重定向在匹配到的第一个location规则里重定向,不能跨location。
[root@localhost ~]# curl 192.168.202.132
this is test2 page
此时是匹配到第一个location的第一个重定向后遇到last标记直接跳到下一个location。
[root@localhost ~]# curl 192.168.202.132
this is test page
此时定位到第一个rewrite后,因为break的作用,既不会在同一个location继续重定向下去,更不会跳转到下一个location的重定向规则中,匹配到此为止。
redirect和permanent适用于外部跳转,即域名跳转。当然也可以用在内部跳转但没必要。这两者的区别在于临时重定向和永久重定向。
(6)域名跳转配置
方案一:
server {
listen 80;
server_name test.com;
rewrite ^/(.*)$ http://www.test.com/$1 permanent;
}
server {
listen 80;
server_name www.test.com;
location / {
root /data/www/;
index index.html index.htm;
}
}
方案二:
server {
listen 80;
server_name test.com;
return 302 http://www.test.com$request_uri ;
}
server {
listen 80;
server_name www.test.com;
location / {
root /data/www/;
index index.html index.htm;
}
}
方案三:
server {
listen 80;
server_name www.test.com test.com;
location / {
if ( $host != 'www.linux.com' ) {
rewrite ^/(.*)$ http://www.test.com/$1 permanent;
}
root /data/www/;
index index.html index.htm;
}
}