富贵长生天做主由不得我
钢骨正气我做主由不得天

论nginx 通配符

<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <rule name="Block File Download" stopProcessing="true">
          <match url="\.(xlsx|pptx|csv|ppt|txt|docx|xls|doc|shtml|shtml)[^\/]*$" />
          <action type="CustomResponse" statusCode="404" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

if ( $request_uri ~ \.(xlsx|pptx|csv|ppt|txt|docx|xls|doc|shtml|shtml)[^\/]*$ ) {
            return 404;
        }   

nginx
location ~ [^/]+\.(jpg|png|gif)

这样可以匹配访问任意图片文件,但不会匹配如 /images/ 这样的目录路径。总结一下:[^\/] 在 Nginx 正则里是一个非常有用的构造,可以用来匹配除 / 之外的任意字符。希望这个说明对您有帮助!如还有任何问题,欢迎继续提出。

常用正则

. : 匹配除换行符以外的任意字符
? : 重复0次或1次
+ : 重复1次或更多次
* : 重复0次或更多次
\d :匹配数字
^ : 匹配字符串的开始
$ : 匹配字符串的介绍
{n} : 重复n次
{n,} : 重复n次或更多次
[c] : 匹配单个字符c
[^/] : 匹配除了/之外的所有字符
[a-z] : 匹配a-z小写字母的任意一个

一、介绍

location指令是http模块当中最核心的一项配置,根据预先定义的URL匹配规则来接收用户发送的请求,根据匹配结果,将请求转发到后台服务器、非法的请求直接拒绝并返回403、404、500错误处理等。本文结合语法、优先级、匹配规则做描述。

二、location指令语法

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

location 顺序/优先级:

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

解释说明(下面会有详解):

= 开头表示精确匹配; 如: A 中只匹配根目录结尾的请求,后面不能带任何字符串.

^~ 开头表示uri以某个常规字符串开头,不是正则匹配;

~ 开头表示区分大小写的正则匹配;

~* 开头表示不区分大小写的正则匹配;

/ 通用匹配, 如果没有其它匹配,任何请求都会匹配到;

三、URI匹配模式

location指令分为两种匹配模式:

1> 普通字符串匹配:以=开头或开头无引导字符(~)的规则

2> 正则匹配:以~或~*开头表示正则匹配,~*表示正则不区分大小写

四、location URI匹配规则

当nginx收到一个请求后,会截取请求的URI部份,去搜索所有location指令中定义的URI匹配模式。在server模块中可以定义多个location指令来匹配不同的url请求,多个不同location配置的URI匹配模式,总体的匹配原则是:先匹配普通字符串模式,再匹配正则模式。只识别URI部份,例如请求为:/test/abc/user.do?name=xxxx

一个请求过来后,Nginx匹配这个请求的流程如下:

1> 先查找是否有=开头的精确匹配,如:location = /test/abc/user.do { … }

2> 再查找普通匹配,以 最大前缀 为原则,如有以下两个location,则会匹配后一项

* location /test/ { … }

* location /test/abc { … }

3> 匹配到一个普通格式后,搜索并未结束,而是暂存当前匹配的结果,并继续搜索正则匹配模式

4> 所有正则匹配模式location中找到第一个匹配项后,就以此项为最终匹配结果

所以正则匹配项匹配规则,受定义的前后顺序影响,但普通匹配模式不会

5> 如果未找到正则匹配项,则以3中缓存的结果为最终匹配结果

6> 如果一个匹配都没搜索到,则返回404

五、精确匹配与模糊匹配差别

location =/ { … } 与 location / { … } 的差别:

* 前一个是精确匹配,只响应/请求,所有/xxx或/xxx/xxxx类的请求都不会以前缀的形式匹配到它

* 后一个是只要以 / 为前缀的请求都会被匹配到。如:/abc , /test/abc, /test/abc/aaaa

实际例子后缀区分:

假设nginx中的配置是:

server {
listen 80;
server_name x.x.x.x;
……
location /subdir {
proxy_pass http://y.y.y.y;   ###注意这里没有以/结尾
}
 
}
那么用户请求http://x.x.x.x/subdir/other时,匹配到该区块,nginx反代会保留虚拟路径,nginx实际
转发后端的请求URL为http://http://x.x.x.x/subdir/other

假如配置为:

server {
listen 80;
server_name x.x.x.x;
……
location /subdir {
proxy_pass http://y.y.y.y/;   ##注意这里以/结尾
}
 
}
那么用户请求http://x.x.x.x/subdir/other时,匹配到该区块,nginx反代不会保留虚拟路径,nginx实际
转发后端的请求URL为http://http://x.x.x.x//other

六、正则与非正则匹配

1> location ~ /test/.+.jsp$ { … } :正则匹配,支持标准的正则表达式语法。

2> location ^~ / { … } : ^~意思是关闭正则匹配,当搜索到这个普通匹配模式后,将不再继续搜索正则匹配模式。

下面看一些实际例子:

location  = / {
  # 精确匹配 / ,主机名后面不能带任何字符串
  [ configuration A ]
}
location  / {
  # 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求
  # 但是正则和最长字符串会优先匹配
  [ configuration B ]
}
location /documents/ {
  # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
  # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
  [ configuration C ]
}
location ~ /documents/Abc {
  # 匹配任何以 /documents/Abc 开头的地址,匹配符合以后,还要继续往下搜索
  # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
  [ 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 {
  # 不区分大小写匹配
  [ configuration I ]
}

赞(0)
版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《论nginx 通配符》
文章链接:https://www.lolmm.cn/stwd/1195.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

评论 抢沙发

评论前必须登录!