精华内容
下载资源
问答
  • location-cleaned14.2(drivers),只需要把里面的文件放到 drivers 文件夹里即可。
  • location-cleaned13.3.rar

    2019-12-28 22:36:34
    location-cleaned-------ios11.4到13.3 包含inject.dmg和inject.dmg.signature亲测可用
  • Location IOS12.3驱动

    千次下载 热门讨论 2019-05-07 09:04:06
    Location你们懂的,谢谢那些大佬的分享。前段时间把手机系统升级成测试版IOS12.3了,导致一直找不到驱动,今天有幸在@_小呵呵 的博客里找到DeviceSupport 12.3。修改了一下名字验证能用。 查看博客!有链接
  • 由于高德地图API升级的太快,导致之前能用的几乎都没了,这个LocationManagerProxy类在Android_Location_V1.3.0还能用,好不容找到,这个,现在分享一下这个包
  • Nginx location的使用

    千次阅读 2019-04-28 19:05:23
    这里我们小结下“普通 location”与“正则 location ”的匹配规则:先匹配普通 location ,再匹配正则 location ,但是如果普通 location 的匹配结果恰好是“严格精确( exact match )”的,则 nginx 不再尝试后面...
    • Nginx是什么

    Nginx(发音同engine x)是一个异步框架的 Web服务器,也可以用作反向代理,负载平衡器 和 HTTP缓存。
    也有人这么解释
    nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;
    同时也是一个IMAP、POP3、SMTP代理服务器;
    nginx可以作为一个HTTP服务器进行网站的发布处理,
    另外nginx可以作为反向代理进行负载均衡的实现。

    • nginx.conf的目录结构

    整个conf文件分为** 全局块、events块、http块、server块、location块**。每个块有每个块的作用域,越外层的块作用域就包含内部块的作用域,如全局块作用域就包含events块、http块、server块和location块。

                        #全局块
    
    event{              #events块
        ...
    }
    
    http{               #http块
    
        server{         #server块
            ...         #server全局块
    
            location{   #location块
                ...
            }
    
            location{   #location块
                ...
            }
        }
    
        server{         #server块
            ...
        }
        ...             #http全局块
    }
    
    • http块

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

    • server块

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

    • location块

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

    location 说明

    • location语法
    location [=|~|~*|^~|@] /uri/ { … } ,意思是可以以“ = ”或“ ~* ”或“ ~ ”或“ ^~ ”或“ @ ”符号为前缀,
    当然也可以没有前缀(因为 [A] 是表示可选的 A ; A|B 表示 A 和 B 选一个),紧接着是 /uri/ ,
    再接着是{…} 指令块,整个意思是对于满足这样条件的 /uri/ 适用指令块 {…} 的指令。
    
    • location的分类

    location分为两类,一类为普通 location,一类为正则location。

    1. 普通location
    “普通 location ”是以“ = ”或“ ^~ ”为前缀或者没有任何前缀的 /uri/ 
    
    1. 正则location
    “正则 location ”是以“ ~ ”或“ ~* ”为前缀的 /uri/
    
    • 多个location场景下的location匹配

    Nginx 的 location 匹配规则是:“正则 location ”让步 “普通 location”的严格精确匹配结果;但覆盖 “普通 location ”的最大前缀匹配结果。

    • 例子1 先普通location,再正则location匹配
    server {
          listen       9090;
          server_name  localhost;
              location / {
              root   html;
              index  index.html index.htm;
              deny all;
          }
          location ~ \.html$ {
              allow all;
          }
    }
    

    location / {… deny all;} 普通 location 以“ / ”开始的 URI 请求(注意任何 HTTP 请求都必然以“/ ”开始,所以“ / ”的意思是所有的请求都能被匹配上),都拒绝访问; location ~.html$ {allow all;} 正则 location以 .html 结尾的 URI 请求,都允许访问。

    • 测试结果
    [root@web108 ~]# curl http://localhost:9090/
    <html>
    <head><title>403 Forbidden</title></head>
    <body bgcolor=”white”>
    <center><h1>403 Forbidden</h1></center>
    <hr><center>nginx/1.1.0</center>
    </body>
    </html>
    
    [root@web108 ~]# curl http://localhost:9090/index.html
    <html>
    <head>
    <title>Welcome to nginx!</title>
    </head>
    <body bgcolor=”white” text=”black”>
    <center><h1>Welcome to nginx!</h1></center>
    </body>
    </html>
    
    [root@web108 ~]# curl http://localhost:9090/index_notfound.html
    <html>
    <head><title>404 Not Found</title></head>
    <body bgcolor=”white”>
    <center><h1>404 Not Found</h1></center>
    <hr><center>nginx/1.1.0</center>
    </body>
    </html>
    
    • curl http://localhost:9090/ 的结果是“ 403 Forbidden ”,说明被匹配到“ location / {…deny all;} ”了,原因很简单HTTP 请求 GET / 被“严格精确”匹配到了普通 location / {} ,则会停止搜索正则 location ;
    • curl http://localhost:9090/index.html 结果是“ Welcome to nginx! ”,说明没有被“ location / {…deny all;} ”匹配,否则会 403 Forbidden ,但 /index.html 的确也是以“ / ”开头的,只不过此时的普通 location / 的匹配结果是“最大前缀”匹配,所以 Nginx 会继续搜索正则 location , location ~ .html$ 表达了以 .html 结尾的都 allow all; 于是接着就访问到了实际存在的 index.html 页面。
    • curl http://localhost:9090/index_notfound.html 同样的道理先匹配 location / {} ,但属于“普通 location 的最大前缀匹配”,于是后面被“正则 location ” location ~ .html$ {} 覆盖了,最终 allow all ; 但的确目录下不存在index_notfound.html 页面,于是 404 Not Found 。
    • 如果此时我们访问 http://localhost:9090/index.txt 会是什么结果呢?显然是 deny all ;因为先匹配上了 location / {…deny all;} 尽管属于“普通 location ”的最大前缀匹配结果,继续搜索正则 location ,但是 /index.txt 不是以 .html结尾的,正则 location 失败,最终采纳普通 location 的最大前缀匹配结果,于是 deny all 了。
    • 例子2 普通 location 的“隐式”严格匹配
    //在例子1的基础上增加精确匹配
    server {
           listen       9090;
           server_name  localhost;
            location /exact/match.html {
               allow all;
           }
               location / {
               root   html;
               index  index.html index.htm;
               deny all;
           }
           location ~ \.html$ {
               allow all;
           }
    }
    
    • 测试结果
    [root@web108 ~]# curl http://localhost:9090/exact/match.html
    <html>
    <head><title>404 Not Found</title></head>
    <body bgcolor=”white”>
    <center><h1>404 Not Found</h1></center>
    <hr><center>nginx/1.1.0</center>
    </body>
    </html>
    

    结果进一步验证了“普通 location ”的“严格精确”匹配会终止对正则 location 的搜索。这里我们小结下“普通 location”与“正则 location ”的匹配规则:先匹配普通 location ,再匹配正则 location ,但是如果普通 location 的匹配结果恰好是“严格精确( exact match )”的,则 nginx 不再尝试后面的正则 location ;如果普通 location 的匹配结果是“最大前缀”,则正则 location 的匹配覆盖普通 location 的匹配。也就是前面说的“正则 location 让步普通location 的严格精确匹配结果,但覆盖普通 location 的最大前缀匹配结果”。

    • 普通 location 的“显式”严格匹配和“ ^~ ” 前缀

    上面我们演示的普通 location 都是不加任何前缀的,其实普通 location 也可以加前缀:“ ^~ ”和“ = ”。其中“ ^~”的意思是“非正则,不需要继续正则匹配”,也就是通常我们的普通 location ,还会继续搜索正则 location (恰好严格精确匹配除外),但是 nginx 很人性化允许配置人员告诉 nginx 某条普通 location ,无论最大前缀匹配,还是严格精确匹配都终止继续搜索正则 location ;而“ = ”则表达的是普通 location 不允许“最大前缀”匹配结果,必须严格等于,严格精确匹配。

    • 例子3
    server {
           listen       9090;
           server_name  localhost;
              location /exact/match.html {
               allow all;
           }
               location ^~ / {
               root   html;
               index  index.html index.htm;
               deny all;
           }
           location ~ \.html$ {
               allow all;
           }
    }
    
    • 测试
    curl http://localhost:9090/	403 Forbidden	403 Forbidden
    curl http://localhost:9090/index.html	Welcome to nginx!	403 Forbidden
    curl http://localhost:9090/index_notfound.html	404 Not Found	403 Forbidden
    curl http://localhost:9090/exact/match.html	404 Not Found	404 Not Found
    
    • 正则 location 与编辑顺序

    location 的指令与编辑顺序无关,这句话不全对。对于普通 location 指令,匹配规则是:最大前缀匹配(与顺序无关),如果恰好是严格精确匹配结果或者加有前缀“ ^~ ”或“ = ”(符号“ = ”只能严格匹配,不能前缀匹配),则停止搜索正则 location ;但对于正则 location 的匹配规则是:按编辑顺序逐个匹配(与顺序有关),只要匹配上,就立即停止后面的搜索。

    server {
           listen       9090;
           server_name  localhost;
           location ~ \.html$ {
               allow all; 
           }  
           location ~ ^/prefix/.*\.html$ {
               deny all;  
           }  
    }
    server {
           listen       9090;
           server_name  localhost;
           location ~ ^/prefix/.*\.html$ {
               deny all;  
           }  
            location ~ \.html$ {
               allow all; 
           } 
    }
    
    • 测试结果
    curl http://localhost:9090/regextest.html	404 Not Found	404 Not Found
    curl http://localhost:9090/prefix/regextest.html	404 Not Found	403 Forbidden
    
    Location ~ ^/prefix/.*\.html$ {deny all;} 表示正则 location 对于以 /prefix/ 开头,
     .html 结尾的所有 URI 请求,都拒绝访问;   location ~\.html${allow all;} 
     表示正则 location 对于以 .html 结尾的 URI 请求,都允许访问。 实际上,
     prefix 的是 ~\.html$ 的子集。在“配置 3.1 ”下,两个请求都匹配上 location ~\.html$ {allow all;} ,
     并且停止后面的搜索,于是都允许访问, 404 Not Found ;在“配置 3.2 ”下, /regextest.html 无法匹配 prefix ,
     于是继续搜索 ~\.html$ ,允许访问,于是 404 Not Found ;然而 /prefix/regextest.html 匹配到 prefix ,
     于是 deny all , 403 Forbidden 。
    

    参考文章

    [^1 ]关于一些对location认识的误区

    展开全文
  • 本文目录 一、常用规则 二、实际使用建议 三、Flag标志位 四、If 判断指令 五、全局变量 ...作为一名Java开发人员,有些东西不经常使用,很容易忘记,好比nginx...location = / { # 精确匹配 / ,主机名后面不能.

    本文目录

    一、常用规则

     二、实际使用建议

    三、Flag标志位

    四、If 判断指令

    五、全局变量

    六、常用正则

    七、Rewrite规则

    八、Rewrite实例

    8.1 实例一

    8.2 实例二

    九、项目实例

    9.1 项目一

    9.2 项目实战


    作为一名Java开发人员,有些东西不经常使用,很容易忘记,好比nginx配置内容,以下内容是记录了公司里很牛的运维工程师的呕心沥血之作,方便后续使用:

    一、常用规则

    location  = / {
      # 精确匹配 / ,主机名后面不能带任何字符串
      [ configuration A ] 
    }
    
    location  / {
      # 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求
      # 但是正则和最长字符串会优先匹配
      [ configuration B ] 
    }
    
    location /documents/ {
      # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
      # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
      [ configuration C ] 
    }
    
    location ~ /documents/Abc {
      # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
      # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
      [ configuration CC ] 
    }
    
    location ^~ /images/ {
      # 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。
      [ configuration D ] 
    }
    
    location ~* \.(gif|jpg|jpeg)$ {
      # 匹配所有以 gif,jpg或jpeg 结尾的请求
      # 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则
      [ configuration E ] 
    }
    
    location /images/ {
      # 字符匹配到 /images/,继续往下,会发现 ^~ 存在
      [ configuration F ] 
    }
    
    location /images/abc {
      # 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在
      # F与G的放置顺序是没有关系的
      [ configuration G ] 
    }
    
    location ~ /images/abc/ {
      # 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用
        [ configuration H ] 
    }
    
    location ~* /js/.*/\.js
    • =开头表示精确匹配
      如 A 中只匹配根目录结尾的请求,后面不能带任何字符串。
    • ^~ 开头表示uri以某个常规字符串开头,不是正则匹配
    • ~ 开头表示区分大小写的正则匹配;
    • ~* 开头表示不区分大小写的正则匹配
    • / 通用匹配, 如果没有其它匹配,任何请求都会匹配到 

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

    上面的匹配结果
    按照上面的location写法,以下的匹配示例成立:

    • / -> config A
      精确完全匹配,即使/index.html也匹配不了
    • /downloads/download.html -> config B
      匹配B以后,往下没有任何匹配,采用B
    • /images/1.gif -> configuration D
      匹配到F,往下匹配到D,停止往下
    • /images/abc/def -> config D
      最长匹配到G,往下匹配D,停止往下
      你可以看到 任何以/images/开头的都会匹配到D并停止,FG写在这里是没有任何意义的,H是永远轮不到的,这里只是为了说明匹配顺序
    • /documents/document.html -> config C
      匹配到C,往下没有任何匹配,采用C
    • /documents/1.jpg -> configuration E
      匹配到C,往下正则匹配到E
    • /documents/Abc.jpg -> config CC
      最长匹配到C,往下正则顺序匹配到CC,不会往下到E

     二、实际使用建议

    所以实际使用中,通常建议至少有三个匹配规则定义,如下:
    #直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网。
    #这里是直接转发给后端应用服务器了,也可以是一个静态首页
    # 第一个必选规则
    location = / {
        proxy_pass http://localhost:8080/index
    }
    # 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
    # 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
    location ^~ /static/ {
        root /webroot/static/;
    }
    location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
        root /webroot/res/;
    }
    #第三个规则就是通用规则,用来转发动态请求到后端应用服务器
    #非静态文件请求就默认是动态请求,自己根据实际把握
    #毕竟目前的一些框架的流行,带.php,.jsp后缀的情况很少了
    location / {
        proxy_pass http://localhost:8080/
    }
    

    三、Flag标志位

    • last : 相当于Apache的[L]标记,表示完成rewrite
    • break : 停止执行当前虚拟主机的后续rewrite指令集
    • redirect : 返回302临时重定向,地址栏会显示跳转后的地址
    • permanent : 返回301永久重定向,地址栏会显示跳转后的地址

    因为301和302不能简单的只返回状态码,还必须有重定向的URL,这就是return指令无法返回301,302的原因了。这里 last 和 break 区别有点难以理解:

    1. last一般写在server和if中,而break一般使用在location中
    2. last不终止重写后的url匹配,即新的url会再从server走一遍匹配流程,而break终止重写后的匹配
    3. break和last都能组织继续执行后面的rewrite指令

    四、If 判断指令

    语法为if(condition){...},对给定的条件condition进行判断。如果为真,大括号内的rewrite指令将被执行,if条件(conditon)可以是如下任何内容:

    • 当表达式只是一个变量时,如果值为空或任何以0开头的字符串都会当做false
    • 直接比较变量和内容时,使用=!=
    • ~正则表达式匹配,~*不区分大小写的匹配,!~区分大小写的不匹配

    -f!-f用来判断是否存在文件
    -d!-d用来判断是否存在目录
    -e!-e用来判断是否存在文件或目录
    -x!-x用来判断文件是否可执行

    例如:

    if ($http_user_agent ~ MSIE) {
        rewrite ^(.*)$ /msie/$1 break;
    } //如果UA包含"MSIE",rewrite请求到/msid/目录下
    
    if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
        set $id $1;
     } //如果cookie匹配正则,设置变量$id等于正则引用部分
    
    if ($request_method = POST) {
        return 405;
    } //如果提交方法为POST,则返回状态405(Method not allowed)。return不能返回301,302
    
    if ($slow) {
        limit_rate 10k;
    } //限速,$slow可以通过 set 指令设置
    
    if (!-f $request_filename){
        break;
        proxy_pass  http://127.0.0.1; 
    } //如果请求的文件名不存在,则反向代理到localhost 。这里的break也是停止rewrite检查
    
    if ($args ~ post=140){
        rewrite ^ http://example.com/ permanent;
    } //如果query string中包含"post=140",永久重定向到example.com
    
    location ~* \.(gif|jpg|png|swf|flv)$ {
        valid_referers none blocked www.jefflei.com www.leizhenfang.com;
        if ($invalid_referer) {
            return 404;
        } //防盗链
    }
    

    五、全局变量

    下面是可以用作if判断的全局变量

    • $args : #这个变量等于请求行中的参数,同$query_string
    • $content_length : 请求头中的Content-length字段。
    • $content_type : 请求头中的Content-Type字段。
    • $document_root : 当前请求在root指令中指定的值。
    • $host : 请求主机头字段,否则为服务器名称。
    • $http_user_agent : 客户端agent信息
    • $http_cookie : 客户端cookie信息
    • $limit_rate : 这个变量可以限制连接速率。
    • $request_method : 客户端请求的动作,通常为GET或POST。
    • $remote_addr : 客户端的IP地址。
    • $remote_port : 客户端的端口。
    • $remote_user : 已经经过Auth Basic Module验证的用户名。
    • $request_filename : 当前请求的文件路径,由root或alias指令与URI请求生成。
    • $scheme : HTTP方法(如http,https)。
    • $server_protocol : 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
    • $server_addr : 服务器地址,在完成一次系统调用后可以确定这个值。
    • $server_name : 服务器名称。
    • $server_port : 请求到达服务器的端口号。
    • $request_uri : 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
    • $uri : 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
    • $document_uri : 与$uri相同。

    例:http://localhost:8080/test1/test2/test.html
    $host:localhost
    $server_port:8080
    $request_uri:http://localhost:8080/test1/test2/test.html
    $document_uri:/test1/test2/test.html
    $document_root:/var/www/html
    $request_filename:/var/www/html/test1/test2/test.html

    六、常用正则

    1. . : 匹配除换行符以外的任意字符
    2. ? : 重复0次或1次
    3. + : 重复1次或更多次
    4. * : 重复0次或更多次
    5. \d :匹配数字
    6. ^ : 匹配字符串的开始
    7. $ : 匹配字符串的介绍
    8. {n} : 重复n次
    9. {n,} : 重复n次或更多次
    10. [c] : 匹配单个字符c
    11. [a-z] : 匹配a-z小写字母的任意一个

    小括号()之间匹配的内容,可以在后面通过$1来引用,$2表示的是前面第二个()里的内容。正则里面容易让人困惑的是\转义特殊字符。

    七、Rewrite规则

    rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。rewrite只能放在server{},location{},if{}中,并且只能对域名后边的除去传递的参数外的字符串起作用,例如 http://seanlook.com/a/we/index.php?id=1&u=str 只对/a/we/index.php重写。语法rewrite regex replacement [flag];

    如果相对域名或参数字符串起作用,可以使用全局变量匹配,也可以使用proxy_pass反向代理。

    表明看rewrite和location功能有点像,都能实现跳转,主要区别在于rewrite是在同一域名内更改获取资源的路径,而location是对一类路径做控制访问或反向代理,可以proxy_pass到其他机器。很多情况下rewrite也会写在location里,它们的执行顺序是:

    1. 执行server块的rewrite指令
    2. 执行location匹配
    3. 执行选定的location中的rewrite指令

    如果其中某步URI被重写,则重新循环执行1-3,直到找到真实存在的文件;循环超过10次,则返回500 Internal Server Error错误。

    八、Rewrite实例

    以下先写两个例子,后续再补充

    8.1 实例一

    http {
        # 定义image日志格式
        log_format imagelog '[$time_local] ' $image_file ' ' $image_type ' ' $body_bytes_sent ' ' $status;
        # 开启重写日志
        rewrite_log on;
    
        server {
            root /home/www;
    
            location / {
                    # 重写规则信息
                    error_log logs/rewrite.log notice; 
                    # 注意这里要用‘’单引号引起来,避免{}
                    rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$' /data?file=$3.$4;
                    # 注意不能在上面这条规则后面加上“last”参数,否则下面的set指令不会执行
                    set $image_file $3;
                    set $image_type $4;
            }
    
            location /data {
                    # 指定针对图片的日志格式,来分析图片类型和大小
                    access_log logs/images.log mian;
                    root /data/images;
                    # 应用前面定义的变量。判断首先文件在不在,不在再判断目录在不在,如果还不在就跳转到最后一个url里
                    try_files /$arg_file /image404.html;
            }
            location = /image404.html {
                    # 图片不存在返回特定的信息
                    return 404 "image not found\n";
            }
    }
    
    

    对形如/images/ef/uh7b3/test.png的请求,重写到/data?file=test.png,于是匹配到location /data,先看/data/images/test.png文件存不存在,如果存在则正常响应,如果不存在则重写tryfiles到新的image404 location,直接返回404状态码。

    8.2 实例二

    rewrite ^/images/(.*)_(\d+)x(\d+)\.(png|jpg|gif)$ /resizer/$1.$4?width=$2&height=$3? last;
    

    对形如/images/bla_500x400.jpg的文件请求,重写到/resizer/bla.jpg?width=500&height=400地址,并会继续尝试匹配location。

    九、项目实例

    9.1 项目一

    以下是我在本地测试时,配置的真实写法

    
    #user  nobody;
    worker_processes  1;
    
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    
    #pid        logs/nginx.pid;
    
    
    events {
        worker_connections  1024;
    }
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        #access_log  logs/access.log  main;
    
        sendfile        on;
        #tcp_nopush     on;
    
        #keepalive_timeout  0;
        keepalive_timeout  65;
    
        #gzip  on;
    
        server {
            listen       9000;
            server_name  *.unisiot.com;
    
            #charset koi8-r;
    
            #access_log  logs/host.access.log  main;
    		
    		ssi on;
    		ssi_silent_errors on;
    		ssi_types text/shtml;
    		expires 30d;
    		
    		location / {
    		   
    		   if ($host ~ (^\S*?(?=\.\S*))){
    			set $dns $1;
    		   }
    		   alias F:/upload_file_root/subsite/$dns;
    		   index index.html;
    		   
    		   #判断终端
    		    if ($http_user_agent ~* '(Android|webOS|iPhone|iPod|BlackBerry|iPad)') {
                   set $mobile_request '1';
                   #如果访问UA为移动终端类型则判断为mobile_request=1
                }
                if ($http_cookie ~ 'mobile_request=full') {
                   set $mobile_request '';
                }
                if ($mobile_request = '') {
                   #proxy_pass http://139.196.188.213;
    			   #判断mobile_request等于空则为PC终端
    			   root   F:/upload_file_root/subsite/$dns/web;
                }
            
                #break; 
    			
    			if ($uri ~* '(lobby|bedroom|livingroom|lavatory|kitchen|videoroom)') {
    				root   F:/upload_file_root/subsite/$dns;
    			}
    		}
    		
    		location /commonHtml {
                alias   F:/upload_file_root/common/;     
            } 
    	
    		location ~ ^/(BJUI|ckeditor4.8|common|images|js|nice-validator|www|static)/ {
                root   F:/upload_file_root/static; 
                autoindex on;
                access_log  off;
                expires     30d;          
            }
    		
    		location ~ ^/(upload)/ {
                root   F:/upload_file_root/; 
                autoindex on;
                access_log  off;
                expires     30d;          
            }
    		
            #error_page  404              /404.html;
            # redirect server error pages to the static page /50x.html
            #
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
        }
    }
    

    9.2 项目实战

    请参考另一篇文章

     

     

    【参考资料】

    1、nginx平台初探(100%):http://tengine.taobao.org/book/chapter_02.html

    2、Module ngx_http_rewrite_module:http://nginx.org/en/docs/http/ngx_http_rewrite_module.html

    展开全文
  • nginx之location规则及地址重写

    千次阅读 多人点赞 2020-08-18 19:37:37
    location规则及rewrite重写


    一、location规则

    1、什么是location?

      nginx就是通过拦截到的请求去对配置好的location块(location block)进行请求代理的。被代理的URL去对location后边的字符串(或正则)进行匹配,根据一定的规则选择走哪个location。

    2、location语法规则

      语法:location [=|^~|~|~*|@] /uri/ { … }

      其中,红色字段为前缀符号,各个前缀符号表达不同的含义。而对于这些前缀符号,分为两类:普通location正则location\~~*前缀表示正则location ,其他前缀(比如:=、^~ 和 @)和无任何前缀的都属于普通location 。

    符 号含 义
    location = /uri= 表示精确匹配,只有完全匹配上才能生效,优先级最高
    location ^~ /uri^~ 表示最大前缀匹配,不做正则匹配检查
    location ~ pattern~ 表示区分大小写的正则匹配
    location ~* pattern~* 表示不区分大小写的正则匹配
    location // 表示通用匹配,任何未匹配到其它location的请求都会匹配到

    3、匹配顺序问题

      匹配之间存在优先级= > ^~ > ~|~* > /

       在nginx配置文件中一般会定义多个location,对于一个特定的HTTP请求,到底应该匹配哪一个location呢(匹配先后顺序)?答案是:先匹配普通location,再匹配正则location

       那么问题又来了,在多个普通location之间是如何匹配的呢?答案是:最大前缀匹配。什么意思呢?举个例子:对一个HTTP请求/www.a.com/nginx/static/test.html进行前缀匹配," location /nginx/ {} " 和 " location /nginx/static/ {} " 两个都满足,根据我们所说的最大前缀匹配,所以选择" location /nginx/static/ {} "。

       同样,多个正则location之前如何匹配的呢?答案是:按照正则location在配置文件中的顺序,如果匹配到一条正则location,那么就不再考虑后面的规则

       在普通location进行了最大前缀匹配后,如果匹配到了一条location,并不意味着结束,这只是作为临时的结果,nginx还要继续检查后面的正则location,如果正则location也有匹配上的,那么正则location会覆盖普通location。

       但是你想在匹配到普通location后,不再需要继续匹配也是可以的。你只需要在普通location前加上 " ^~ "(^表示非,~表示正则)或 " = "(严格匹配),都可以终止后面的匹配。

    4、location实例

      配置文件中location块的解释:

    ########### 每个指令必须有分号结束。#################
    location  [=|^~|\~|\~*|@] {
               #root path;  #根目录
               #index test.html;  #设置默认页
               #proxy_pass  http://mysvr;  #转发动态请求到后端应用服务器mysvr
            } 
    

      这里我们修改虚拟主机a的配置进行演示。

    [root@nginx-server ~]# vim /etc/nginx/conf.d/a.conf
    server {
        listen 192.168.140.142:80;
        server_name www.a.com;
        access_log /data/a/log/access.log combined;
        location / {
            echo "A_rule /";
        }
        location =/ {
            echo "B_rule = /";
        }
        location /1/ {
            echo "C_rule /1/";
        }
        location /1/2/ {
            echo "D_rule /1/2/";
        }
        location /1/2/test.html {
            echo "E_rule /1/2/test.html";
        }
        location ~ \.html$ {
            echo "G_rule .html";
        }
        location ~* \.png$ {
            echo "I_rule all:png";
        }
        location ~ \.(gif|jpg|png|js|css)$ {
            echo "H_rule gif|jpg|png|js|css";
        }
    }
    
    

      匹配结果是这样的:

       访问 http://www.a.com/ 将精确匹配到 B_rule。

    在这里插入图片描述

       访问 http://www.a.com/1/ 将精确匹配 C_rule。

    在这里插入图片描述
       访问 http://www.a.com/1/2/ 将最大前缀匹配 D_rule。

    在这里插入图片描述

       访问 http://www.a.com/1/2/index.html 将首先最大前缀匹配到 D_rule,但是会被后面的正则匹配 G_rule 覆盖。

    在这里插入图片描述
       访问 http://www.a.com/test.html 匹配到 E_rule 后,就不再继续匹配。

    在这里插入图片描述

       访问 http://www.a.com/test.png 将根据正则location顺序匹配到 I_rule。

    在这里插入图片描述
       访问 http://www.a.com/3 都将匹配不上,所以走 A_rule 的默认规则。

    在这里插入图片描述

    二、地址重写

    1、什么是地址重写?

      Rewrite又称URL Rewrite,即URL重写,就是把传入Web的请求重定向到其他URL的过程。

    2、应用场景

      ① 伪静态化,是将动态页面显示为静态页面方式的一种技术。理论上,搜索引擎更喜欢静态页面形式的网页,搜索引擎对静态页面的评分一般要高于动态页面。所以,URL Rewrite可以让我们网站的网页更容易被搜索引擎所收录。
      ② 提高安全性,如果在URL中暴露太多的参数,无疑会造成一定量的信息泄漏,可能会被一些黑客利用,对你的系统造成一定的破坏,所以静态化的URL地址可以给我们带来更高的安全性。
      ③ 美化URL,去除一些后缀名或参数串,让网页的地址看起来尽可能简洁明快,有利于反映访问模块内容。
      ④ 实现地址跳转、协议跳转、端口跳转。

    3、如何使用?

      Nginx Rewrite相关指令有if、rewrite、set、return等。我们先来认识这些指令以及几个常用的全局变量,再通过实例来深入学习。

      ① rewrite 指令

      应用环境:server、location、if;

      语法:rewrite regex replacement [flag]

    • regex:表示使用正则或字符串来匹配相应的地址
    • replacement:表示重定向的地址
    • flag:标志位,用于控制当匹配到对应的rewrite规则后是否继续检查后续的rewrite规则,flag的值可以是:
    flag描 述
    last本条规则匹配完成后,停止匹配,将重写后的地址重新发起请求进行匹配,浏览器地址栏URL地址不变
    break本条规则匹配完成后,停止匹配,不再匹配后面的规则
    redirect返回302临时重定向,地址栏会显示跳转后的地址
    permanent返回301永久重定向,地址栏会显示跳转后的地址

      redirect与permanent区别: 对于客户端来说一般状态下是没有区别的。而对于搜索引擎,相对来说301的重定向更加友好,如果我们把一个地址采用301跳转方式跳转的话,搜索引擎会把老地址的相关信息带到新地址,同时在搜索引擎索引库中彻底废弃掉原先的老地址。使用302重定向时,搜索引擎(特别是google)有时会查看跳转前后哪个网址更直观,然后决定显示哪个,如果它觉的跳转前的URL更好的话,也许地址栏不会更改,那么很有可能出现URL劫持的现像。在做URI重写时,有时会发现URI中含有相关参数,如果需要将这些参数保存下来,并且在重写过程中重新引用,可以使用 () 和 $N 的方式来解决。

      ② if 指令(判断语句)

      应用环境:server、location;

      语法:if (condition) { … }

      其中condition就是条件,如果为true,则执行大括号中的内容。if支持的条件判断匹配符号如下:

    条件判断匹配符
    =!=比较变量和字符串是否相等/相同
    ~匹配正则表达式(区分大小写)
    ~*匹配正则表达式(不区分大小写)
    !~!~*可以理解为"与正则表达式不匹配时返回真",与上面同理,一个区分大小写,一个不区分大小写;
    -f!-f判断文件是否存在
    -d!-d判断目录是否存在
    -e!-e判断文件或目录是否存在
    -x!-x判断文件是否可执行

    tip:当表达式只是一个变量时,如果值为空或任何以0开头的字符串都会当做false。

      ③ set 指令(定义一个新的变量)

      应用环境:server、location、if;

      语法:set variable_name value

    • variable_name:变量名称
    • value:变量值

      ④ return 指令(结束执行配置语句并为客户端返回状态码)

      语法:return code

    • code:状态码,可以是204,400,402-406,408,410,411,413,416,500-504,默认返回None。

      ⑤ 常用全局变量

    全局变量解  释
    $host请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名
    $request_filename当前请求的文件路径,由root指令所指定的根目录和请求的uri组成
    $request_uri当前请求的文件路径,请求的uri

      你肯定看不懂,我们来测试一下,你就会明白!

    [root@nginx-server ~]# vim /etc/nginx/conf.d/a.conf
    server {
        listen 192.168.140.142:80;
        server_name www.a.com;
        access_log /data/a/log/access.log combined;
        location / {
            root /data/a/basic;    #根目录
            echo $host;
            echo $request_filename;
            echo $request_uri;
        }
    }
    
    

    在这里插入图片描述

    4、rewrite实例

      之前在配置虚拟主机时,已经配置过域名解析,所以可以直接用windows上的浏览器进行测试。

       访问:http://www.a.com/111/1.html
        跳转:http://www.a.com/222/2.html

     location /111/ {
            rewrite .* /222/2.html permanent;
        }
    
    

       访问:http://www.a.com/2015/aaa/bbb/1.html
        跳转:http://www.a.com/2014/aaa/bbb/1.html

    location /2015/ {
            rewrite ^/2015/(.*)$ /2014/$1 permanent;
        }
    
    

       访问:http://www.a.com/
        跳转:http://www.b.com/

    if ($host ~* www.a.com) {
            rewrite .* http://b.com permanent;
        }
    
    

       访问:http://www.a.com/aaa/1.html
        跳转:http://www.b.com/aaa/1.html

        if ($host ~* www.a.com) {
            rewrite .* http://b.com$request_uri permanent;
        }
    
    

       在访问目录后添加/ (如果目录后已有/,则不加/)
       访问:http://www.a.com/aaa
       跳转:http://www.a.com/aaa/

    if (-d $request_filename) {
            rewrite ^(.*)([^/])$ http://$host$1$2/ permanent;
        }
    
    

       访问:http://www.a.com/login/1.html
        跳转:http://www.a.com/reg/login.php?user=1

    location /login/ {
            rewrite ^/login/(.*).html$ /reg/login.php?user=$1 permanent;
        }
    
    

       访问:http://www.a.com/uplook/11-22-33.html
        跳转:http://www.a.com/uplook/11/22/33.html

    location /uplook/ {
            rewrite ^/uplook/([0-9]+)-([0-9]+)-([0-9]+)\.html$ /uplook/$1/$2/$3.html permanent;
        }
    

       访问:http://jack.a.com
        跳转:http://www.a.com/jack

      这里需要配置域名解析。
      记事本打开"C:\Windows\System32\drivers\etc\hosts"文件,在末尾添加"192.168.140.142 jack.a.com" 。

    if ($host ~* "^www.a.com$" ) {    #如果没有这一条配置,http://jack.a.com重写为http://www.a.com/jack会继续来匹配,导致跳转为http://www.a.com/www。
        break;
        }
    if ($host ~* ^(.*)\.a\.com$) {
            set $user $1;
            rewrite .* http://www.a.com/$user permanent;
        }
    
    

       实现端口跳转
        访问:80
        跳转:443

    server {
        listen 80;
        server_name www.a.com;
        return 301 https://www.a.com$request_uri;
    }
    server {
        listen 443 ssl;
        server_name www.a.com;
        ssl on;    #nginx 1.15及以后的版本,不需要再写 ssl on;
        ssl_certificate /usr/local/nginx/conf/cert.pem;
        ssl_certificate_key /usr/local/nginx/conf/cert.key;:
    }
    
    展开全文
  • 前置文章: Linux(CentOS7) 下 Nginx1.15.8 安装步骤 ...用 Nginx 可以很好地帮我们实现路由功能,我们所有需要做的就是配置好 location 模块。 目录 语法规则 匹配规则 proxy_pass 代理转发 root 与 inde...

    前置文章:

    Linux(CentOS7) 下 Nginx1.15.8 安装步骤

    Nginx 的配置文件 nginx.conf

    我们访问一个网址,服务器返回对应的资源。那么一个网址是如何对应一个资源的呢?
    用 Nginx 可以很好地帮我们实现路由功能,我们所有需要做的就是配置好 location 模块。

    目录

    语法规则

    匹配规则

    proxy_pass 代理转发

    root 与 index

    root 与 alias

    location 执行过程

    rewrite 重定向

    Nginx 处理请求的11个阶段


    语法规则

     location [=|~|~*|^~] /uri/ {… }

    符号含义
    =精确匹配 
    ^~非正则匹配
    ~正则匹配(区分大小写)
    ~*正则匹配(不区分大小写)
    !~正则不匹配(区分大小写)
    !~*正则不匹配(不区分大小写)
     普通匹配(这里没有符号的时候)

    匹配规则

    1. 精准匹配命中时,停止location

    2.一般匹配(普通和非正则)命中时,对比所有命中的一般匹配,选出最长的一条

    3.如果最长的那一条为非正则匹配,直接匹配此条,停止location

    4.如果最长的那一条为普通匹配,继续尝试正则location(以上至此都不存在代码顺序)

    5.按代码顺序执行正则匹配,当第一条正则location命中时,停止location

    示例:

    想运行以下示例需先下载第三方模块echo-nginx-module:

    #下载到/usr/local/src目录

    wget https://github.com/openresty/echo-nginx-module/archive/v0.61.tar.gz

    tar -zxvf v0.61.tar.gz                                 

    #在Nginx源码目录nginx-1.15.8下配置,--add-module指向模块目录即会安装插件到nginx中

    ./configure --add-module=/usr/local/src/echo-nginx-module-0.61/

    make && make install

    #验证安装

    nginx -V

    你还需要配置 C:\Windows\System32\drivers\etc\hosts 文件,添加“虚拟机ip 域名”到最后:

    192.168.100.14 test.loaction.com

    server {
    
    	listen       80;
    	server_name  test.location.com;
    
    	#精准匹配测试
    	#第1,2条虽然匹配,但第三条是精准匹配,出第三条结果
    	#测试路径/equal/a/b/c
    	location ~ /equal/* {
    		echo '/equal/*';
    	}
    	location /equal/a/b {
    		echo '/equal/a/b';
    	}
    	location = /equal/a/b/c {
    		echo '/equal/a/b/c';
    	}
    
    	#普通匹配测试
    	#第1,2条虽然匹配,第三条匹配更长,出第三条结果
    	#测试路径/match/a/b/c
    	location /match/a {
    		return 200  "/match/a";
    	}
    	location /match/a/b {
    		return 200  "/match/a/b";	
    	}
    	location /match/a/b/c {
    		 return 200  "/match/a/b/c";
    	}
    	location /match/a/b/c/d {
    		return 200  "/match/a/b/c/d"; 
    	}
    
    	#正则匹配覆盖普通匹配,不会覆盖非正则匹配
    	#访问/re/a.htm,会被后面的正则覆盖
    	#访问/re/a/b开头的路径,不会被后面的正则覆盖
    	location /re/a.htm {
    		 echo 'match /re/a.htm';
    	}
    	location ^~ /re/a/b {
    		echo 'math ^~/re/a/b*';		
    	}
    	location ~ /re/(.*)\.(htm|js|css)$ {
    		echo "cover /re/$1.$2";
    	}
    
    	#正则匹配成功一条后,便不再走其它正则
    	#测试路径/rex/a/b/c.htm
    	location ~ /rex/.*\.(htm|js|css)$ {
    		echo "match first";
    	}
    	location ~ /rex/a/(.*)\.(htm|js|css)$ {
    		echo "match second";
    	}
    	location ~ /rex/a/b/(.*)\.(htm|js|css)$ {
    		echo "match third";
    	}
    }
    

    结果:

    精准匹配最优先

    一般匹配选最长

    正则覆盖普通匹

    不能覆盖非正则

    正则匹配选首位

     

    proxy_pass 代理转发

    在上面的示例中,我们通过修改本机hosts文件,让本机访问 test.loaction.com 相当于访问 192.168.100.14。我们现在假设有一个服务在 192.168.100.15 这台机器上。我们能不能通过访问 test.loaction.com,访问到 192.168.100.15 上的资源呢?

    这样的想法其实是在模拟实际做项目的时候,我们可以只购买一个域名,然后访问多个云服务器。我们要做的就是让域名对应的服务器具有代理转发的功能。这里是服务器作为代理,让客户端能通过访问代理服务器来访问其它服务器,所以是反向代理


    通过在 location 里配置 proxy_pass 就能实现代理转发功能,帮助我们将请求转发到别的服务器。

    我们先看示例再看规则:

    server {
            listen       80;
            server_name	test.location.com;
    
            本机ip地址:192.168.100.104
    
            #后端服务路径:
            http://192.168.100.105:8080/user/query?id=1
            
            #规则一:
            #访问路径:http://test.location.com/user/query?id=1
            location /user {
            #path1:/user path2:/query 
                              #ip:port 后面无 /
                   proxy_pass http://192.168.0.105:8080;
            }
            
            规则二:
            #访问路径 :http://test.location.com/A/user/query?id=1
            location /A/user {
            #path1:/A/user path2:/query 
                               #ip:port 后面有 /xxx
                    proxy_pass http://192.168.0.105:8080/user;
            }
           
        }

    解读:

    后端服务路径都是 http://192.168.100.105:8080/user/query?id=1。用规则一,可以使访问路径为 http://test.location.com/user/query?id=1;用规则二,可以使访问路径为 http://test.location.com/A/user/query?id=1

    规则:

    1. 访问路径格式为 sever_name + path1 + path2 + ?param

    2. location 后面的路径就是 path1,对照访问路径格式,path1 和 ?param 之间的为path2

    3. 如果 proxy_pass 后面的值形如 http: // ip : port; 

        那么实际访问的地址是 http: // ip : port + path1 + path2 + ?param

    4. 如果 proxy_pass 后面的值形如 http: // ip : port / xxx; (末尾相比上面有 /xxx)

        那么实际访问的地址是 http: // ip : port  + path2 + ?param

    规则二的作用:

    如果我们访问其它服务器都使用规则一,那么我们将无法直观地从 URL 确定这个服务属于那台机器或者哪种服务。

    而如果使用规则二,我们可以通过合理的设置明确地知道,我们访问的是服务A。

    root 与 index

    nginx.conf 里的默认 location 如下:

    location / {
                root   html;
                index  index.html;
            }

    意思是资源文件的根目录在 nginx 程序所在文件夹下的 html 文件夹:

    如果我们没有写 URI,默认的资源是 html 文件夹下的 index.html

    但是你如果这样配置:

    location / {
                root   html;
                index  index.html;
            }
    
    location /index.html {
                    echo "index";
            }

    最后访问 http://test.location.com/ 浏览器会输出 index:

    也就是说,虽然前面设置了 index ,但是如果它对应的地址有被 location 匹配到的话,会执行 location 匹配后的结果

    但是,必须还是得有 index 对应的文件

    为了验证上面这一点,我把 html 目录下的 index.html 改成 index,再 reload 并访问:

    root 与 alias

    还是先看示例比较直观:

    server {
            listen       80;
            server_name	test.local.com;
    
        #文件地址:/etc/nginx/html/static/a.html
    
    	#访问路径:http://test.local.com/static/a.html 	
    	location /static {
            #path1:/static path2:/a.html
            root /etc/nginx/html/;
            #文件地址:root + path1 + path2
            }
    
    	#访问路径:http://test.local.com/target/a.html 
    	location /target {
            #path1:/target path2:/a.html
            alias /etc/nginx/html/static/;
            #文件地址:alias + path2
            }	       
        }
    

    解读:

    文件地址一样,访问路径可以不同。

    使用 root 声明的是根目录,经过 location 匹配后,直接去根目录下找访问路径中 sever_name 后面的文件地址。

    使用 alias 声明的是别名目录,经过 location 匹配后,去别名目录下找访问路径中 sever_name 后面除去 location 匹配的地址的剩余地址。这就好像给 location 匹配的地址取了个别名一样。

    规则

    1. 访问路径格式为 sever_name + path1 + path2 

    2.  location 后面的路径就是 path1,对照访问路径格式,path1 后面的就是 path2

    3. 如果使用 root ,文件地址为:

        root + path1 +path2

    4. 如果使用 alias ,文件地址为:

       alias + path2

    location 执行过程

    结合以上内容,就很容易理解 location 执行过程了,如下图

    rewrite 重定向

    location 里还可以配置 rewrite 实现重定向:

    rewrite regex replacement [flag];

    其中:

    regex:正则表达式

    replacement :替换值flag:后续处理标识,可以为 break/last/permanent/redirect


    重点在于 flag :

    1. flag=break

    发生 nginx 内部重定向,path值被更新,rewrite层面的命令会中断。原控制流程逻辑不变往下走

    2. flag=last

    发生nginx内部重定向,path值被更新,rewrite层面的命令会中断。控制流程刷新,重新进行整个location层的逻辑流程

    3. flag= permanent/redirect

    发生页面重定向(301永久重定向/302临时重定向),nginx流程结束,返回http响应到浏览器,页面url更新

    4.flag为空

    发生nginx内部重定向,path值被更新,rewrite层面的命令继续。最后一个rewrite完毕,刷新控制流程,重新进行location重匹配

    示例:

    server {
    
    	listen       80;
    	server_name  test.location.com;
    
    	location /a.html {
    		echo 'I am a.html';
    	}
    	location /b.html {
    		echo 'I am b.html';
    	}
    
    	#此路径请求:http://test.location.com/aa.html
    	location /aa.html {##内部重定向
    		rewrite ^/  /a.html break;##不会执行下面的rewrite		
    		rewrite ^/  /b.html break;	
    		root   /etc/nginx/html/;
    	}
    	
    
    	#此路径请求:http://test.location.com/ab.html
    	location /ab.html {##内部重定向
    		rewrite ^/  /a.html last;##不会执行下面的rewrite,但重新location匹配
    		rewrite ^/  /b.html last;
    		rewrite ^/  /c.html;
    		root   /etc/nginx/html/;		
    	}
    
    	#此路径请求:http://test.location.com/ba
    	location /ba {
    		rewrite ^/  /b.html permanent;##301永久重定向
    		root   /etc/nginx/html/;
    	}
    
    
    	#此路径请求:http://test.location.com/bb
    	location /bb {
    		rewrite ^/  /b.html redirect;##302临时重定向
    		set $aa 12;
    		root   /etc/nginx/html/;
    	}
    	
    	#此路径请求:http://test.location.com/cc.html
    	location /cc.html {
                    rewrite ^/  /c.html;##指令不停,继续往下
                    rewrite ^/  /b.html;
                    rewrite ^/  /a.html;##最后一条,生效的是这条
                    root   /etc/nginx/html/;
            }
    
    }
    

    结果:

    访问 http://test.location.com/aa.html,直接寻找 root 目录下的 a.html,我没有写这个 html,所以是 404

    访问 http://test.location.com/ab.html,因为重新 location 匹配了,所以匹配到了上面的 /a.html,输出了一句话

    访问 http://test.location.com/ba,永久重定向,可以看到地址栏的网址都变了,是外部重定向

    访问 http://test.location.com/bb,临时重定向

    访问 http://test.location.com/cc.html,不是 404,也经过了重新 location 匹配

    Nginx 处理请求的11个阶段

    Nginx 处理请求的全过程一共划分为 11 个阶段(如图),按阶段由上到下依次执行 (上一阶段的所有指令执行完毕,才进入下一阶段)

    各阶段的含义如下:

    • post_read: 接收到完整的 http 头部后处理的阶段,在uri重写之前。一般跳过
    • server_rewrite: location匹配前,修改uri的阶段,用于重定向,location块外的重写指令(多次执行)
    • find_config: uri 寻找匹配的location块配置项(多次执行)
    • rewrite:找到location块后再修改uri,location级别的uri重写阶段(多次执行)
    • post_rewrite:防死循环,跳转到对应阶段
    • preaccess: 权限预处理
    • access:判断是否允许这个请求进入
    • post_access: 向用户发送拒绝服务的错误码,用来响应上一阶段的拒绝
    • try_files: 访问静态文件资源
    • content : 内容生成阶段,该阶段产生响应,并发送到客户端
    • log:记录访问日志
    展开全文
  • nginx location 误区

    千次阅读 2018-06-08 08:28:08
    有些童鞋的误区1、 location 的匹配顺序是“先匹配正则,再匹配普通”。 矫正: location 的匹配顺序其实是“先匹配普通,再匹配正则”。我这么说,大家一定会反驳我,因为按“先匹配普通,再匹配正则”解释不了大家...
  • ndk location和download都是灰的点不了,不去配置这个会影响我之后的操作吗 <p><img alt="" height="530" src="https://img-ask.csdnimg.cn/upload/1620696485236.png" width="950" /></p> <p><img alt="" ...
  • Location 指令介绍

    千次阅读 2021-01-15 21:38:50
    location:用来设定不同URI 的文件系统的路径映射,一个server中可以设置多个location,Nginx会根据用户请求的URI 地址来逐个判断location, 找出最佳匹配规则,然后应用该location中定义的配置。 语法规则: ...
  • 详解location对象

    万次阅读 多人点赞 2020-06-15 16:31:28
    Location 接口表示其链接到的对象的位置(URL)。所做的修改反映在与之相关的对象上。 Document 和 Window 接口都有这样一个链接的Location,分别通过 Document.location和Window.location 访问。
  • nginx的location配置详解

    千次阅读 2018-08-22 14:54:13
    - break是终止当前location的rewrite检测,而且不再进行location匹配 - last是终止当前location的rewrite检测,但会继续重试location匹配并处理区块中的rewrite规则 1、下面是可以用来判断的表达式: -f和!-f用来...
  • 在openResty中,ngx.location.capture_multi是一个非常强大的功能。可以应用于并发多个相互之间没有依赖的请求。在现代的应用架构中经常使用微服务,提供低粒度的接口;但在客户端(例如:app、网页服务)经常需要...
  • location对象

    千次阅读 2019-04-25 14:37:18
    location对象是window对象中的一个属性值,可以通过window.location访问。罗列下location的一些属性和方法: location对象的属性有: 属性 描述 返回值举例 hash 设置或返回从井号 (#) 开始的 URL(锚...
  • nginx location配置详细解释

    万次阅读 多人点赞 2018-02-19 16:55:51
    多个location配置的情况下匹配顺序为(参考资料而来,还未实际验证,试试就知道了,不必拘泥,仅供参考): 首先 精确匹配 = -》 其次 以xx开头 匹配^~ -》 然后 是按文件中顺序的正则匹配 -》 最后 是交给 / ...
  • 详解Nginx location 匹配规则

    千次阅读 2020-05-13 20:33:47
    location [=|~|~*|^~] /uri/ { … } 模式 含义 location = /uri = 表示精确匹配,只有完全匹配上才能生效 location ^~ /uri ^~ 开头对URL路径进行前缀匹配,并且在正则之前。 location ~ pattern ...
  • AngularJS $location学习笔记

    万次阅读 2016-08-30 09:37:34
    AngularJS $location学习笔记一、$lacation能做什么? $location服务分析浏览器地址栏中的URL(基于window.location),让我们可以在应用中较为方便地使用URL里面的东东。在地址栏中更改URL,会响应到$location服务...
  • Nginx配置location优先级详解

    千次阅读 多人点赞 2019-10-29 20:42:42
    Nginx location优先级详解: nginx location语法规则:location [=|~|~*|^~|/] /uri/ { … } nginx的location匹配的变量是$uri 符号 说明 = 表示精确匹配 ^~ 表示uri以指定字符或字符串开头 ~ 表示区分...
  • Android学习笔记(五六) 位置Location

    千次阅读 2019-02-01 16:05:17
    Android学习笔记(五六) 位置Location
  • 别名配置,用于访问文件系统,在匹配到location配置的URL路径后,指向【alias】配置的路径。如: location /test/ { alias /home/sftp/img/; } location /test/aaa/ { alias /home/sftp/img/; } location /...
  • Location语法规则

    千次阅读 2019-04-24 18:34:09
    Location规则 语法规则: location [=||*|^~] /uri/ {… } 首先匹配 =,其次匹配^~,其次是按文件中顺序的正则匹配,最后是交给 /通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。 符号 含义 ...
  • nginx配置 location root

    千次阅读 2020-11-12 15:10:58
    nginx指定文件路径有两种方式root和alias,root与alias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上。 最基本的区别 alias 指定的目录是准确的,给...
  • location对象的属性与方法

    千次阅读 热门讨论 2020-12-29 16:54:24
    location对象详解Location 对象Location 对象属性Location 对象方法location.assign()location.replace()location.reload()location.href 兼容性问题 最近在项目开发中遇到了一个问题,客户的需求是要根据URL中传入...
  • 一、location语法 location [ = | 空格 | ~ | ~* | ^~ ] uri { ... } 精准匹配: = 字符串匹配: 空格 优于正则匹配: ^~ 正则匹配: ~ | ~* | !~ | !~* 通用匹配: /  其中," ~ "表示-正则...
  • 首先需要在 AndroidManifest.xml 文件中添加「获取模拟定位...uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.INTERNET"/&...
  • window location跳转

    万次阅读 2019-06-20 10:38:56
    "top.location.href"是最外层的页面跳转 "window.location.href"、"location.href"是本页面跳转 "parent.location.href"是上一层页面跳转. location是window对象的属性,而所有的网页下的对象都是属于window作用域...
  • location 前缀字符串及优先级 示例 location 匹配原则 if 和 break 指令 if break return、rewrite 和 try_files 指令 return 指令 rewrite 指令 flag 标志位 示例 try_files 指令 正则表达式 Nginx ...
  • nginx location中斜线的位置的重要性

    千次阅读 2020-04-11 18:25:42
    最新在配置nginx时,意外发现location中目录斜线有和没有的区别,百度了找找发现没有几个人说的清楚,最后找到一个兄弟写的还比较实用,再次谢过... 一、nginx代理后端服务 nginx 服务器及端口 127.0.0.1:80 ...
  • ## nginx中的location配置如下: ![nginx中location配置 :](https://img-ask.csdn.net/upload/201806/25/1529936111_513364.jpg) ## 三个location的访问结果如下: ![图片说明]...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,301,173
精华内容 520,469
关键字:

location