zoukankan      html  css  js  c++  java
  • nginx的Location的总结以及rewrite规则的总结

    Location的语法:

    location ”定位”的意思根据Uri来进行不同的定位.

    在虚拟主机的配置中,是必不可少的,location可以把网站的不同部分,定位到不同的处理方式上.

    比如碰到.php, 如何调用PHP解释器?  --这时就需要location

    location 的语法:

    location [=|~|~*|^~] patt {

    }

    中括号可以不写任何参数,此时称为一般匹配

    也可以写参数,因此,大类型可以分为3

    1 location = patt {} [精准匹配]
    2 location patt{}  [一般匹配]
    3 location ~ patt{} [正则匹配]

    如何发挥作用?

     1 首先看有没有精准匹配,如果有,则停止匹配过程.
     2 location = patt {
     3     config A
     4 }
     5 如果 $uri == patt,匹配成功,使用configA
     6    location = / {
     7               root   /var/www/html/;
     8              index  index.htm index.html;
     9         }
    10          
    11    location / {
    12              root   /usr/local/nginx/html;
    13             index  index.html index.htm;
    14   }
    15 
    16 如果访问  http://xxx.com/
    17 定位流程是 
    18 1: 精准匹配中 ”/”   ,得到index页为  index.htm
    19 2: 再次访问 /index.htm , 此次内部转跳uri已经是”/index.htm” , 
    20 根目录为/usr/local/nginx/html
    21 3: 最终结果,访问了 /usr/local/nginx/html/index.htm

    再来看,正则也来参与.

     1 location / {
     2             root   /usr/local/nginx/html;
     3             index  index.html index.htm;
     4         }
     5 
     6 location ~ image {
     7            root /var/www/image;
     8            index index.html;
     9 }
    10 
    11 如果我们访问  http://xx.com/image/logo.png
    12 此时, “/” 与”/image/logo.png” 匹配
    13 同时,”image”正则 与”image/logo.png”也能匹配,谁发挥作用?
    14 正则表达式的成果将会使用.
    15 
    16 图片真正会访问 /var/www/image/logo.png 

    我们接下来再看一下下面的这个例子:

     1 location / {
     2              root   /usr/local/nginx/html;
     3              index  index.html index.htm;
     4          }
     5  
     6 location /foo {
     7             root /var/www/html;
     8              index index.html;
     9 }
    10 我们访问 http://xxx.com/foo
    11  对于uri “/foo”,   两个location的patt,都能匹配他们
    12 即 ‘/’能从左前缀匹配 ‘/foo’, ‘/foo’也能左前缀匹配’/foo’,
    13 此时, 真正访问 /var/www/html/index.html 
    14 原因:’/foo’匹配的更长,因此使用之.;

    rewrite 重写

    下面看一下具体的语法:

    重写中用到的指令
    if  (条件) {}  设定条件,再进行重写 
    set #设置变量
    return #返回状态码 
    break #跳出rewrite
    rewrite #重写
    
    
    If  语法格式
    If 空格 (条件) {
        重写模式
    }
    
    条件又怎么写?
    答:3种写法
    1: “=”来判断相等, 用于字符串比较
    2: “~” 用正则来匹配(此处的正则区分大小写)
       ~* 不区分大小写的正则
    3: -f -d -e来判断是否为文件,为目录,是否存在.

    我们看一下下面的具体的例子:

     1  if  ($remote_addr = 192.168.1.100) {
     2       return 403;
     3   }
     4 
     5             //判断是不是IE的用户    
     6  If  ($http_user_agent ~ MSIE) {
     7      rewrite ^.*$ /ie.htm;
     8      break; #(不break会循环重定向)
     9  }
    10 
    11  if (!-e $document_root$fastcgi_script_name) {
    12           rewrite ^.*$ /404.html 
    13           break;
    14 } 
    15 注, 此处还要加break,

    以 xx.com/dsafsd.html这个不存在页面为例,

    我们观察访问日志日志中显示的访问路径,依然是GET /dsafsd.html HTTP/1.1

    提示服务器内部的rewrite302跳转不一样

    跳转的话URL都变了,变成重新http请求404.html, 而内部rewrite, 上下文没变,

    就是说 fastcgi_script_name 仍然是 dsafsd.html,因此 会循环重定向.

    set 是设置变量用的可以用来达到多条件判断时作标志用.

    达到apache下的 rewrite_condition的效果

    我们来看一下set变量的一些用法:

     1 if ($http_user_agent ~* msie) {
     2                 set $isie 1;
     3             }
     4 
     5             if ($fastcgi_script_name = ie.html) {
     6                 set $isie 0;
     7             }
     8 
     9             if ($isie 1) {
    10                 rewrite ^.*$ ie.html;
    11             }

    此时我们不需要加break进行

  • 相关阅读:
    SqlServer数据库同步方案详解(包括跨网段)
    makefile 和shell文件相互调用
    处理百万级以上的数据处理
    makefile Template(添加多个lib)
    Linux下如何删除非空目录
    makefile Template
    g++ 编译和链接
    gcc include路径
    C++ XML解析之TinyXML篇
    利用Lucene.net搭建站内搜索(2)分词技术
  • 原文地址:https://www.cnblogs.com/shangzekai/p/4684043.html
Copyright © 2011-2022 走看看