Nginx服务器Location规则

Location 基础知识:

1.1 概念:

我们可以通过配置location指令块,来决定客户端发送过来的请求URL如何处理

1.2 语法:

Syntax: location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
Default: —
Context: server, location

location 配置可以有两种配置方法,可以在server指令块和location指令块配置。
1、修饰符 + uri(资源路径)
2、@ + name

1.2.1 修饰符
  • ~ :大小写敏感(正则表达式)
  • = : 精确匹配(必须全部相等)
  • ~*:忽略大小写(正则表达式),这里要注意忽略大小写的意思是请求的字符大小写都可以, 但是不会进行大小转换,请求的大小写对应的文件必须存在。
  • ^~ :只需匹配uri部分
  • @ :内部服务跳转

2.location配置实例

2.1 精确匹配

=,精准匹配,一般是匹配某个具体文件

location = /index.html {
  [ configuration ]
}
# 则匹配到`http://www.v1jfedu.com/index.html`这种请求。

2.2 大小写铭感匹配

~ :大小写敏感(正则表达式)

 location ~ /LUTIXIA/ {
    [ configuration ]
 }
 #请求示例
 #http://www.v1.jfedu.com/LUTIXIA/ [成功]
 #http://www.v1.jfedu.com/lutixia/ [失败]

2.3 大小写不敏感匹配

~:忽略大小写(正则表达式)*

location ~* /lutixia.html {
    [ configuration ]
}
# 则会忽略 uri 部分的大小写
#http://www.v1.jfedu.com/jfedu.html [成功] 可以成功匹配,但是目录中要lutixia.html文#http://www.v1.jfedu.com/JFEDU.html [成功] 可以成功匹配,但是目录中要LUTIXIA.html文

2.4 指定后缀匹配

匹配以gif、jpg、jpeg结尾的文件

location ~* \.(gif|jpg|jpeg)$ {
 [ configuration ]
}
#http://www.iflytek.com/img/iflytek.jpg [成功]

2.5 忽略正则匹配

location ^~ /img/ {
   [ configuration ]
}
#以 /img/ 开头的请求,都会匹配上
#http://www.iflytek.com/img/iflytek.jpg  [成功]
#http://www.iflyek.com/img/iflytek.png [成功]

如果配置了2.5,那么所有请求 /img/ 下的图片会被上面的处理,因为 ^~ 指令匹配到了,则不检查正则
表达式。对比这两个location,可以设置不同目录,相同文件进行实验。

3.Location 优先级

在这里插入图片描述
以上四个匹配优先级最高的为精准匹配
在这里插入图片描述
注释精准匹配,结果如下:
在这里插入图片描述
注释忽略正则匹配,结果如下:
在这里插入图片描述
注,第二个和的第三个规则都是正则,这时会按照至上而下的顺序匹配。

4.rewrite规则

Nginx的rewrite功能需要pcre软件的支持,即通过perl兼容正则表达式语句进行规则匹配的。
默认参数编译nginx就会支持rewrite的模块,但是也必须要pcre的支持。
rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement,结尾是flag标记。

rewrite  <regex>  <replacement>  [flag];
            正则     替代内容      flag标记
            
正则:perl兼容正则表达式语句进行规则匹配

替代内容:将正则匹配的内容替换成replacement

flag标记:rewrite支持的flag标记

# flag标记说明:
last  #本条规则匹配完成终止当前location的规则,继续向下匹配新的location URI规则
break  #本条规则匹配完成即终止,不再匹配后面的任何规则
redirect  #返回302临时重定向,浏览器地址会显示跳转后的URL地址,关闭服务,无法重定向。
permanent  #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址,关闭服务,依然可以重定向,清除缓存失效

5. rewrite实例:

5.1 实现域名跳转

要求:访问v1.jfedu.net 跳转到 v2.jfedu.net

    server {
       listen      80;
       server_name  v1.jfedu.net;

       root   /home/hadoop/nginx/v1;
       index  index.html index.htm;
       rewrite ^/(.*)$ http://v2.jfedu.net:8082/$1 permanent;
       # 正则 ^/(.) 表示匹配所有的请求,匹配成功后,跳转到后面指定的url地址
       # $1是取出前面正则表达式分组括号里的内容

       charset utf-8;
       access_log  logs/host.access.log  main;
       }
 ############################################################
 server {
        listen       8082;
        server_name  v2.jfedu.net;
        charset utf-8;
        access_log  logs/v3.access.log  jfedu;
        location / {
            root   /home/hadoop/nginx/v2;
            index  index.html index.htm;
        }
}
###两个server可以同时写在nginx.conf中,为实验方便,
###将server分开在单独两个文件中。前面章节说过 include参数:include vhost/*.conf;

在这里插入图片描述

5.2 实现浏览器的语言跳转

要求:当页面为中文语言时,打印this is 中文

    server {
       listen      80;
       server_name  v1.jfedu.net;

       root   /home/hadoop/nginx/v1;
       index  index.html index.htm;
#       rewrite ^/(.*)$ http://v2.jfedu.net:8082/$1 permanent;

       charset utf-8;
       access_log  logs/host.access.log  main;

       if ( $http_accept_language ~ "^zh-CN" ) {
                rewrite ^/$ /zh;
                }
       if  ( $http_accept_language ~ "^en") {
                rewrite ^/$ /en;
                }
       }

在这里插入图片描述
在 /home/hadoop/nginx/v1目录下创建目录

mkdir  -p  /home/nginx/v1/{zh,en}
echo "this is  中文" >   /home/nginx/v1/zh/index.html
echo "this is  English" >  /home/nginx/v1/en/index.html

访问如下:
在这里插入图片描述
调整浏览器的语言,结果如下
在这里插入图片描述

5.3.实现不同终端跳转

(1) 通过安卓ios等不通的操作系统,访问的页面不同

    server {
       listen      80;
       server_name  v1.jfedu.net;

       root   /home/hadoop/nginx/v1;
       index  index.html index.htm;
       charset utf-8;
       access_log  logs/host.access.log  main;
       
        if ( $http_user_agent ~* "iphone|android") {
                rewrite ^/(.*) http://m.jfedu.net/$1;
                }
               
############################################################3

(2) 发布一个手机终端界面:


 mkdir  -p /home/hadoop/nginx/m
 echo "this is iphone" > m/index.html
 ##################################################
    server {
       listen      80;
       server_name  m.jfedu.net;

       root   /home/hadoop/nginx/m;
       index  index.html index.htm;
           }

重启服务,访问页面,并且切换浏览器为iphone终端:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值