前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >nginx之location指令

nginx之location指令

作者头像
山行AI
发布2019-08-05 20:54:54
1.3K0
发布2019-08-05 20:54:54
举报
文章被收录于专栏:山行AI山行AI

语法、规则、优先级、注意事项

Nginx的HTTP配置主要包括三个区块:

代码语言:javascript
复制
http { //这个是协议级别  include mime.types;  default_type application/octet-stream;  keepalive_timeout 65;  gzip on;    server { //这个是服务器级别      listen 80;      server_name localhost;        location / { //这个是请求级别          root html;          index index.html index.htm;        }      }}

下面我们主要介绍的是location块的内容。

语法

代码语言:javascript
复制
location [=|~|~*|^~] patt { }  //中括号中为修饰符,可以不写任何参数,此时称为一般匹配,也可以写参数
因此,大类型可以分为三种:
  location = patt {} [精准匹配]
  location patt{}     [普通匹配]
  location ~ patt{}  [正则匹配]

规则

localtion可以由前缀字符串或正则表达式定义。正则表达式使用前面的“〜*”修饰符(不区分大小写匹配)或“〜”修饰符(用于区分大小写匹配)指定。要找到匹配给定请求的位置,nginx首先检查使用前缀字符串(前缀位置)定义的位置。默认情况, nginx先检查前缀字符串,然后检查正则表达式,如果前缀字符串匹配到了,并且前缀字符串有这个“^~” 要求,就不配正则了;如果没有这个“^~” ,即使前缀匹配到了,也要去匹配正则表则,如果正则表达式匹配到了,就是用正则表达式的,没有就是用前缀字符串匹配到的路径

1. 没有修饰符表示必须以指定模式开始。

代码语言:javascript
复制
        location  /img {            root   D:/nginx/img;            index  test.png;        }

以下访问都是对的:

代码语言:javascript
复制
http://localhost/imghttp://localhost/img/http://localhost/imgdehttp://localhost/img?p1

配成:

代码语言:javascript
复制
location  /img/ {                root   D:/nginx/img/;                index  test.png;            }

效果还是一样。因为使用的是前缀字符串匹配。

2. =表示必须与指定的模式精确匹配

代码语言:javascript
复制
location = /img/ {                root   D:/nginx/;                index  test.png;            }

那么,如下是对的:

代码语言:javascript
复制
http://localhost/imghttp://localhost/img?p1

如下是错的:

代码语言:javascript
复制
http://localhost/img/http://localhost/imgmde

3. ~ 表示:指定的正则表达式要区分大小写

代码语言:javascript
复制
server {server_name localhost;  location ~ ^/img$ {    root   D:/nginx/;      index  test.png;  }}那么,如下是对的:http://localhost/imghttp://localhost/img?p1=11&p2=22如下是错的:http://localhost/IMGhttp://localhost/img/http://localhost/imgde

4. ~* 表示:指定的正则表达式不区分大小写

代码语言:javascript
复制
server {server_name localhost;location ~* ^/abc$ {    root   D:/nginx/;         index  test.png;  }}那么,如下是对的:http://localhost/abchttp://localhost/ABChttp://localhost/abc?p1=11&p2=22如下是错的:http://localhost/abc/http://localhost/abcde

5. ^~ 类似于无修饰符的行为,也是以指定模式开始,不同的是,如果模式匹配,那么就停止搜索其他模式了。如果最长匹配的前缀位置具有“^〜”修饰符,则不会检查正则表达式。

注意,上面说的提升优先级主要是针对模式匹配,=不是模式匹配。

代码语言:javascript
复制
location ^~ /img/ {                        root   D:/nginx/img/;                        index  test.png;}            location = /img/test.png {                        root   D:/nginx/denghao/;                        index  test.png;}

这种情况会匹配等号的路径,=号的优先级比^~高。

6. @定义命名location区段,这些区段客户端不能访问

代码语言:javascript
复制
    location  @named {      configuration  E    }        #它是专门用来处理“内部重定向(internally redirected )如try_files或error_page等

看完上面的可以看下下面这个:

代码语言:javascript
复制
server {
        listen 80; 
        server_name localhost; 
        location =/text.html { #精准匹配,浏览器输入IP地址/text.html,定位到服务器/var/www/html/text.html文件
            root /var/www/html;   
            index text.html;
        }
        location / { #普通匹配,浏览器输入IP地址,定位到服务器/usr/local/nginx/html/default.html文件
            root html;   
            index default.html;
        }
    location ~ image { #正则匹配,浏览器输入IP/image..地址会被命中,定位到/var/www/image/index.html
      root /var/www/image;
      index index.html;    }
    }

优先级

代码语言:javascript
复制
location = / {  # 只匹配 / 的查询.  [ configuration A ]}location / {  # 匹配任何以 / 开始的查询,但是正则表达式与一些较长的字符串将被首先匹配。  [ configuration B ]}location ^~ /images/ {  # 匹配任何以 /images/ 开始的查询并且停止搜索,不检查正则表达式。  [ configuration C ]}location ~* \.(gif|jpg|jpeg)$ {  # 匹配任何以gif, jpg, or jpeg结尾的文件,但是所有 /images/ 目录的请求将在Configuration C中处  理。  [ configuration D ]} 
  • =/:精准匹配,浏览器输入IP地址,定位到configuration A
  • /:普通匹配,浏览器输入IP地址,定位到configuration B
  • ^~ /images/ : /images/1.gif → configuration C
  • /documents/1.jpg → configuration D

总结:

  • 等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项。
  • ^~类型表达式。一旦匹配成功,则不再查找其他匹配项。
  • 正则表达式类型(~ ~*)的优先级次之。如果有多个location的正则能匹配的话,则使用正则表达式最长的那个。
  • 常规字符串匹配类型。按前缀匹配。

注意点

1. root 、alias指令区别:

代码语言:javascript
复制
location /img/ {    alias /var/www/image/;}

若按照上述配置的话,则访问/img/目录里面的文件时,ningx会自动去/var/www/image/目录找文件

代码语言:javascript
复制
location /img/ {    root /var/www/image;}

若按照这种配置的话,则访问/img/目录下的文件时,nginx会去/var/www/image/img/目录下找文件。

alias是一个目录别名的定义,root则是最上层目录的定义。还有一个重要的区别是alias后面必须要用“/”结束,否则会找不到文件的,而root则可有可无。

2. 特殊字符

URL中的哈希值(后面的URL部分#)不会在HTTP请求中按设计发送。因此,nginx对此无能为力。 当用户访问时http://example.com/#aaa,nginx只会看到请求http://example.com。一种可能的解决方法是在前端使用Javascript从URL中删除哈希。

这一点可以通过设置日志格式:

然后访问http://localhost:9999/#/landingOtc/

在access.log中:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开发架构二三事 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 语法
  • 规则
  • 优先级
  • 注意点
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档