<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 ] }
评论前必须登录!
注册