Nginx由内核和模块组成,其中内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端的请求映射到一个location block,而location是Nginx配置中的一个指令,用于访问的URL匹配,而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作。

  默认Nginx.conf配置文件中至少存在一个location /,即表示客户端浏览器请求的URL为:域名+/,如果location /newindex/,则表示客户端浏览器请求的URL为:域名+/newindex/。常见Location匹配URL的方式如下:

=                           字面精确匹配;

^~                          最大前缀匹配;

/                           不带任何前缀:最大前缀匹配;

~                           大小写相关的正则匹配;

~*                          大小写无关的正则匹配;

@                           location内部重定向的变量。

  其中Location =、^~、/属于普通字符串匹配,Location ~、~*属于正则表达式匹配,Location优先级与其在Nginx.conf配置文件中的先后顺序无关。

  Location = 精确匹配会第一个被处理,如果发现精确匹配,Nginx则停止搜索其他任何Location的匹配。

  普通字符匹配,正则表达式规则和完整URL规则将被优先和查询匹配,^~为最大前缀匹配,如果匹配到该规则,Nginx则停止搜索其他任何Location的匹配,否则nginx会继续处理其他location指令。

  正则匹配"~"和"~*",如果找到相应的匹配,则Nginx停止搜索其他任何Location的匹配;当没有正则表达式或者没有正则表达式被匹配的情况下,那么匹配程度最高的逐字匹配指令会被使用。

Location规则匹配优先级总结如下:

(location =) > (location 完整路径) > (location ^~ 路径) > (location ~|~* 正则顺序) > (location 部分起始路径) > (location  /)

Location 案例演示

添加echo-nginx-module模块支持在配置文件中使用echo、sleep、time及exec等类似shell命令

#下载echo模块

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

#重新预编译、编译、安装Nginx

[root@localhost nginx-1.14.0]# ./configure --add-module=../echo-nginx-module-0.61/

[root@localhost nginx-1.14.0]# make && make install

[root@localhost nginx-1.14.0]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.14.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)
configure arguments: --add-module=../echo-nginx-module-0.61/

--------------------------------------------------------------------------------------------------

Location案例

(1)Location = 精确匹配会第一个被处理,如果发现精确匹配,Nginx则停止搜索其它任何Location的匹配。增加配置如下:

server {

省略...

location / {

echo 'test1';

}

location =  / {

echo 'test2';

}

省略...

}

[root@localhost nginx]# curl 10.0.0.12
test2

增加匹配 /index.html

  location = /index.html {

    echo 'test3';

}

[root@localhost nginx]# curl 10.0.0.12/index.html
test3
[root@localhost nginx]# curl 10.0.0.12
test2
[root@localhost nginx]# curl 10.0.0.12/test.html
test1

默认“/”解释:“/”匹配任何请求,因为所有请求都是以“/”开始;但是更长字符匹配或者正则表达式匹配会优先匹配,“/”优先级最低。

注:在这个案例中我们访问精确匹配必须是和配置文件规定的完全匹配才会匹配到对应的内容,如果没有匹配到任何的精确匹配则会交给 / 匹配。

--------------

(2)测试目录匹配,有两种配置模式,,目录匹配或前缀匹配,任选其一或搭配使用。

=  #字面精确匹配;

  location = /images/ {

    echo 'test4';

  }

[root@localhost nginx]# curl 10.0.0.12/images
test1

[root@localhost nginx]# curl 10.0.0.12/images/
test4

^~最大前缀匹配;域名后面匹配的目录必须是location写的参数,才能匹配到location中的文件。

  location ^~ /images/ {

    echo 'test5';

  }

[root@localhost nginx]# curl 10.0.0.12/images
test1
[root@localhost nginx]# curl 10.0.0.12/images/
test5
[root@localhost nginx]# curl 10.0.0.12/images/111
test5

注:匹配 / 后面的内容以 /images/ 开头的内容。

域名后面跟的第一个斜杠代表“/”,第二个斜杠就代表在访问的是一个目录,第三个斜杠代表可能有两层目录。

#10.0.0.12/images 代表访问的 images 这个文件

#10.0.0.12/images/ 代表访问的 images 这个目录

(3)正则文件匹配

~ :大小写相关的正则匹配;

~*:大小写无关的正则匹配;

location ~* \.(html|txt|gif|jpg|jpeg)$ {

  echo 'test6';

}

location ~ \.(html|txt|gif|jpg|jpeg)$ {

  echo 'test7';

}

#正则匹配中“.” 号匹配的时候默认是匹配所有单个字符,加上“\”转义符号,将“.” 号转义成真正意义上的点号。

#(html|txt|gif|jpg|jpeg)表示匹配html、txt等字符。

# $ 号代表必须以对应的字符结尾。

#可以通过调整两个的顺序来测试。

[root@localhost nginx]# curl 10.0.0.12/index.html
test6
[root@localhost nginx]# curl 10.0.0.12/index.HTML
test6

注:~大小写相关匹配,规定必须和配置文件一样(配置文件写的大小写来确定)的小写或者大写才能匹配到该请求。大小写无关匹配,不论是大写还是小写都会匹配到该请求(例如:以HTML和html结尾都会匹配到test7)

(4)基础正则匹配

location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$

 .号:匹配任意单个字符;

 *号:匹配前面的字符任意次。

#这个正则匹配的任意字符开头的以gif|jpg|jpeg|bmp|png|ico|txt|js|css这些文件结尾的后缀名,才能匹配这个规则。

Nginx Location规则的更多相关文章

  1. Nginx location规则匹配

    ^~   标识符匹配后面跟-一个字符串.匹配字符串后将停止对后续的正则表达式进行匹配,如location ^~ /images/ , 在匹配了/images/这个字符串后就停止对后续的正则匹配 = 精 ...

  2. nginx location 路由的几个配置纪要

    1:网上没有查到在线测试 nginx location 规则的网址 在服务器上可以通过 return 返回测试比如  把#号去掉 # location /admin\.php(.*) # { #def ...

  3. 详细解析 nginx uri 如何匹配 location 规则

    location 是 nginx 配置中出现最频繁的配置项,一个 uri 是如何与多个 location 进行匹配的? 在有多个 location 都匹配的情况下,如何决定使用哪一个 location ...

  4. nginx 反向代理 配置 https 实现http https同时存在 经测试 支持location 规则

    server { listen ssl; #监听443端口 server_name www.app01.com; ssl on; #启用ssl加密 ssl_certificate /etc/cert/ ...

  5. nginx里面的location 规则匹配

    nginx location语法 ~ # 区分大小写的正则匹配 location ~ \.(gif|jpg|png|js|css)$ { #规则D } ~* # 不区分大小写的正则匹配(和~的功能相同 ...

  6. 附001.Nginx location语法规则

    一 location规则 1.1 location语法 基本语法: location [=|~|~*|^~]/uri/{...} 修饰符释义: 1 = #表示精确严格匹配,只有请求的url路径与后面的 ...

  7. Nginx location 匹配顺序整理

    Nginx location模块整理 具体的Nginx安装就不在这里描述了,这里只是为了对location的描述 Nginx环境 a. 查看当前系统cat /etc/redhat-release [r ...

  8. Nginx Location配置总结

    Nginx Location配置总结 语法规则: location [=|~|~*|^~] /uri/ { - }= 开头表示精确匹配^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即 ...

  9. nginx location语法使用说明

    语法规则: location [=|~|~*|^~] /uri/ { … } = 开头表示精确匹配 ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可.nginx不对url做编码,因 ...

随机推荐

  1. IDEA创建maven各种原型项目汇总

    1: internal -> appfuse-basic-jsf (创建一个基于Hibernate,Spring和JSF的Web应用程序的原型) 2: internal -> appfus ...

  2. 【MAC】安装chrome浏览器

    step1:下载dmg安装包 chrome下载地址 点击[下载Chrome] step2:安装chrome 下载好googlechrome.dmg文件后,像其它程序一样安装就可以了 打开访达--> ...

  3. wpf的控件style

    前段时间一直在做wpf的UI开发,每次想做些控件style定制的时候都很头疼 很多控件不知道他的controltemplate是什么样的 为了方便大家写style 特别奉上wpf的style大全 从此 ...

  4. 创建策略(Creation Policy )和生命周期(Life Cycle)

    前言 在前面的介绍中我们已经知道:导入和导出的匹配成功需要ContractType,ContractName,Metadata都匹配,这里我们还要介绍一个新的东西:创建策略(creation poli ...

  5. 十一:jinja2模板传参

    从后台传参到模板,模板再渲染到前端 传参的时候,可以在html后面加上关键字传参,在模板里面用{{ 参数 }}使用即可,可以传多个参数 也可以使用**传参,取值的时候就直接取内容

  6. 监控Linux服务器上python服务脚本

    提供给公司使用的测试平台这两天频繁地挂掉,影响到相关同事的正常使用,决定在服务器上写个监控脚本,监控到服务挂了就启动起来,一分钟检查一次.注:后台服务使用的是python.监控脚本如下: NUM=`p ...

  7. 慕课网_Java入门第二季

    第1章 类和对象 1-1 什么是类和对象 (07:36) 1-2 如何定义 Java 中的类 (07:18) 1-3 如何使用 Java 中的对象 (04:45) 1-4 练习题 1-5 Java 中 ...

  8. shell脚本判断端口是否打开

    [root@www zabbix_scripts]# cat check_httpd.sh #!/bin/bash a=`lsof -i: | wc -l` " ];then " ...

  9. 项目连接oracle报错:listener does not currently know of SID given in connect descriptor

    今天练习用IDEA搭建了一个ssm框架,数据库是oracle,在执行mybatis-generator时,一直报错listener does not currently know of SID giv ...

  10. C++ 多文件编译简述:头文件、链接性、声明与定义

    目录 Commen Sense 头文件 链接性 static 与链接性控制 extern 与外部链接性 Reference Commen Sense C++ 在编译时对每个翻译单元(Translati ...