zoukankan      html  css  js  c++  java
  • 理解 nginx 的location 块匹配规则。

    1、location 介绍

    location是Nginx中的块级指令(block directive),,location指令的功能是用来匹配不同的url请求,进而对请求做不同的处理和响应,这其中较难理解的是多个location的匹配顺序,本文会作为重点来解释和说明。

    开始之前先明确一些约定,我们输入的网址叫做请求URI,nginx用请求URI与location中配置的URI做匹配。

    2、localtion 语法

    匹配URL类型,有四种参数可选,当然也可以不带参数

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

    默认的location 块 后面是有一个 斜杆的,表示模糊匹配所有uri。

    location匹配参数解释:

    (1) “=” ,精确匹配

    • 内容要同表达式完全一致才匹配成功
    location = /abc/ {
      .....
     }
            
    # 只匹配http://abc.com/abc
    #http://abc.com/abc [匹配成功]
    #http://abc.com/abc/index [匹配失败]

    使用精确匹配的时候注意uri最后面是否有斜杠,浏览器访问时是否在最后自动添加斜杆

    (2) “~”,执行正则匹配,区分大小写。

    location ~ /Abc/ {
      .....
    }
    #http://abc.com/Abc/ [匹配成功]
    #http://abc.com/abc/ [匹配失败]

    (3)“~*”,执行正则匹配,忽略大小写

    location ~* /Abc/ {
      .....
    }
    # 则会忽略 uri 部分的大小写
    #http://abc.com/Abc/ [匹配成功]
    #http://abc.com/abc/ [匹配成功]

    (4)“^~”,表示普通字符串匹配上以后不再进行正则匹配。

    location ^~ /index/ {
      .....
    }
    #以 /index/ 开头的请求,都会匹配上
    #http://abc.com/index/index.page  [匹配成功]
    #http://abc.com/error/error.page [匹配失败]

    (5)不加任何规则时,默认是大小写敏感,前缀匹配,相当于加了“~”与“^~”

    location /index/ {
      ......
    }
    #http://abc.com/index  [匹配成功]
    #http://abc.com/index/index.page  [匹配成功]
    #http://abc.com/test/index  [匹配失败]
    #http://abc.com/Index  [匹配失败]
    # 匹配到所有uri

    (6)“@”,nginx内部跳转

    location /index/ {
      error_page 404 @index_error;
    }
    location @index_error {
      .....
    }
    #以 /index/ 开头的请求,如果链接的状态为 404。则会匹配到 @index_error 这条规则上。

    3、location匹配顺序

    = > ^~ > ~ | ~* > 最长前缀匹配 > /

    序号越小优先级越高

    1. location = # 精准匹配
    • = 匹配优先级最高。一旦匹配成功,则不再查找其他匹配项。
    1. location ^~ # 带参前缀匹配
    • ^~类型表达式。一旦匹配成功,则不再查找其他匹配项。
    1. location ~ # 正则匹配(区分大小写)
    2. location ~* # 正则匹配(不区分大小写)
    3. location /a # 普通前缀匹配,优先级低于带参数前缀匹配。
    4. location / # 任何没有匹配成功的,都会匹配这里处理

    4、location URI结尾带不带 /

    1. 如果 URI 结构是  的形式,尾部有没有 / 都不会造成重定向。因为浏览器在发起请求的时候,默认加上了 / 。虽然很多浏览器在地址栏里也不会显示 / 。这一点,可以访问百度验证一下。
    2. 如果 URI 的结构是  。尾部如果缺少 / 将导致重定向。因为根据约定,URL 尾部的 / 表示目录,没有 / 表示文件。所以访问 /some-dir/ 时,服务器会自动去该目录下找对应的默认文件。如果访问 /some-dir 的话,服务器会先去找 some-dir 文件,找不到的话会将 some-dir 当成目录,重定向到 /some-dir/ ,去该目录下找默认文件。

    5,location 块下的root 和 alias 配置命令的区别。

    • [root] 语法:root path 默认值:root html 配置段:http、server、location、if

    • [alias] 语法:alias path 配置段:location

    • 区别在于nginx如何解释location后面的uri

      root的处理结果是:root路径+location路径

      alias的处理结果是:使用alias路径替换location路径,所以如果location 的最后面有 /,alias 的结尾也一定要加上 / 号。

    • 一般情况下,在location /中配置root,在location /other中配置alias是一个好习惯
  • 相关阅读:
    suse12安装详解
    Centos7上部署openstack mitaka配置详解(将疑难点都进行划分)
    菜鸟帮你跳过openstack配置过程中的坑[文末新添加福利]
    openstack中dashboard页面RuntimeError: Unable to create a new session key. It is likely that the cache is unavailable.
    Multiple network matches found for name 'selfservice', use an ID to be more specific.报错
    查看 SELinux状态及关闭SELinux
    SELinux深入理解
    IP地址、子网掩码、网络号、主机号、网络地址、主机地址
    Oracle job procedure 存储过程定时任务
    POI文件导出至EXCEL,并弹出下载框
  • 原文地址:https://www.cnblogs.com/fengfengyang/p/15550300.html
Copyright © 2011-2022 走看看