一、配置多个location匹配规则
location ^~ /admin { alias /var/www/admin/; index regist.html; } location / { root /data/html/; index index.html index.html; }
二、root和alias的区别
root与alias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上。 root的处理结果是:root路径+location路径 alias的处理结果是:使用alias路径替换location路径 alias是一个目录别名的定义,root则是最上层目录的定义。 还有一个重要的区别是alias后面必须要用“/”结束,否则会找不到文件的。。。而root则可有可无~~ location 块中,root 和alias 指令后的路径最后面,有没有 "/" 的区别如下:
location ^~ /dev-popularize/ { # root 指令中:如果后面没有 "/" 则 dist 这个目录下,必须有 dev-popularize 这个目录,然后你的静态资源文件都在这个目录下 # root /Users/shounaer/dist; # root 指令中:如果后面有 "/" 则 dist 这个目录下,不需要有 dev-popularize 这个目录,你的静态资源文件直接放在dist目录下就行 # root /Users/shounaer/dist/; # alias 指令中:如果后面没有 '/' ,则 dist 目录下,无论有没有dev-popularize 都不行,会报 403。 alias /Users/shounaer/dist; # 最终解析效果为:/Users/shounaer/distindex.html 所以会报 403. # alias 指令中:如果后面有 '/' ,则 dist 目录下,直接放你的静态资源文件就行 # alias /Users/shounaer/dist/; # 最终效果:/Users/shounaer/dist/index.html index index.html; }
三、location语法规则
1、=表示精确匹配,优先级最高,匹配成功后则停止向下搜索。 # 精确匹配,必须是127.0.0.1/ location = / { ... } # 精确匹配,必须是127.0.0.1/login location = /login { ... } 2、^=对uri 起始字符 做 字符串匹配,不是 正则匹配。 区分大小写 ## 127.0.0.1/static/js. location ^~ /static/ { ... } 3、~对 uri (可以不是起始字符)做 正则匹配,区分大小写 ## 区分大小写,以gif,jpg,js结尾 location ~ \.(gif|jpg|png|js|css)$ { ... } 4、~*对 uri (可以不是起始字符)做 正则匹配,不区分大小写 ## 不区分大小写,匹配.png结尾的 location ~* \.png$ { ... } 5、!~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则匹配 ## 区分大小写,匹配不以.xhtml结尾的 location !~ \.xhtml$ { ... } location !~* \.xhtml$ { ... } 6、不带符号匹配起始于此字符串的所有uri,区分大小写,字符串匹配 ## 什么都可以 location / { ... } 注意:字符串匹配(无论是 ^~ 还是 无符号 匹配),后面表达式必须以 / 开头,否则永远无法匹配到。
- 精确匹配:
=
, 后面的表达式中写的是纯字符串 - 字符串匹配:
^~
和无符号匹配
, 后面的表达式中写的是纯字符串 - 正则匹配:
~
和~*
和!~
和!~*
, 后面的表达式中写的是正则表达式
匹配顺序 = > ^~ > ~ > ~* > 不带符号 多个字符串匹配同时存在时,谁的表达式中被匹配到的字符越多,就命中谁。 比如:访问: localhost:8080/imgs 时, location ^~ /img {} 不会被命中, location /imgs {} 会被命中。 多个正则匹配同时存在且表达式均满足匹配规则时,谁排在前面,谁先命中,不存在匹配到的字符串长度一说。 如果 ^~ 、 无符号匹配 、 ~ 、 ~* 同时存在,且他们的表达式均满足匹配规则。则按照如下规则命中 先看字符串匹配,被匹配到的字符长度越长,越优先命中; 如果是无符号匹配被命中(被匹配到的字符长度较长),则再去查看正则匹配,如果正则匹配中也有被匹配到的,那么对应的正则匹配被命中,原本命中到的无符号匹配被舍弃。 location @name { ... } 此种方式的location配置,无法通过外网访问,只能通过内网跳转,实现容错的功能。
四、其它
1、第一个必选规则 location = / { proxy_pass http://127.0.0.1:3000/ } 2、第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项 有两种配置模式,目录匹配和后缀匹配,任选其一或搭配使用 location ^~ /static/ { root /webroot/static/; } location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ { root /webroot/res/; } 3、第三个规则就是通用规则,用来转发动态请求到后端应用服务器 location /api/ { proxy_pass http://127.0.0.1:3000/api/ }
五、Rewrite 重定向
last – 表示完成rewrite break – 中止Rewirte,不在继续匹配 redirect – 返回临时重定向的HTTP状态302 permanent – 返回永久重定向的HTTP状态301 1、下面是可以用来判断的表达式: -f和!-f用来判断是否存在文件 -d和!-d用来判断是否存在目录 -e和!-e用来判断是否存在文件或目录 -x和!-x用来判断文件是否可执行 2、下面是可以用作判断的全局变量 例:http://localhost:88/test1/test2/test.php $host:localhost $server_port:88 $request_uri:/test1/test2/test.php $document_uri:/test1/test2/test.php $document_root:D:\nginx/html $request_filename:D:\nginx/html/test1/test2/test.php
六、return 重定向
rewrite 重定向:需要先做正则匹配,然后再给客户端返回新地址进行重定向(做了两步操作) return 重定向:不需要做正则匹配,直接给客户端返回新地址进行重定向(做了一步操作) server { listen 80; server_name start.igrow.cn; return 301 https://$host$request_uri; }
七、if 模块
// 如果用户设备为IE浏览器的时候,重定向 。如果UA包含"MSIE",rewrite请求到/msid/目录下 if ($http_user_agent ~ MSIE) { rewrite ^(.*)$ /msie/$1 break; } //如果cookie匹配正则,设置变量$id等于正则引用部分 if ($http_cookie ~* "id=([^;]+)(?:;|$)") { set $id $1; } //如果提交方法为POST,则返回状态405(Method not allowed)。return不能返回301,302 if ($request_method = POST) { return 405; } //限速,$slow可以通过 set 指令设置 if ($slow) { limit_rate 10k; } //如果请求的文件名不存在,则反向代理到localhost 。这里的break也是停止rewrite检查 if (!-f $request_filename){ break; proxy_pass http://127.0.0.1; } //如果query string中包含"post=140",永久重定向到example.com if ($args ~ post=140){ rewrite ^ http://example.com/ permanent; } //防盗链 location ~* \.(gif|jpg|png|swf|flv)$ { valid_referers none blocked www.jefflei.com www.lfa.com; if ($invalid_referer) { return 404; } }
八、防盗链
location ~* \.(gif|jpg|swf)$ { valid_referers none blocked start.igrow.cn sta.igrow.cn; if ($invalid_referer) { rewrite ^/ http://$host/logo.png; } }如果
valid_referers
条件判断未通过,nginx 则会赋值 invalid_referer
为true
语法:
valid_referers none | blocked | server_names | string ...;
参数说明:
none
: 不允许 “Referer” 来源头部为空的情况blocked
: 不允许“Referer”值为空情况,有可能Referer的值被代理或者防火墙删除server_names
: “Referer”来源头部包必须含当前的server_names (当前域名)可以多个
九、根据文件类型设置过期时间
location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ { if (-f $request_filename) { expires 1h; break; } }
十、禁止访问某个目录
location ~* \.(txt|doc)${ root /data/www/wwwroot/linuxtone/test; deny all; }
十一、
$host : 请求主机头字段,否则为服务器名称。 $http_user_agent : 客户端agent信息 $http_cookie : 客户端cookie信息 $request_method : 客户端请求的动作,通常为GET或POST。 $content_length : 请求头中的Content-length字段。 $content_type : 请求头中的Content-Type字段。 $request_uri : 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。 $uri : 不包含请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。 $document_uri : 与$uri相同。 $query_string $args : 这个变量等于请求行中的参数,同$query_string $document_root : 当前请求在root指令中指定的值。 $limit_rate : 这个变量可以限制连接速率。 $request_body_file $request_filename : 当前请求的文件路径,由root或alias指令与URI请求生成。 $remote_addr : 客户端的IP地址。 $remote_port : 客户端的端口。 $remote_user : 已经经过Auth Basic Module验证的用户名。 $scheme : HTTP方法(如http,https)。 $server_protocol : 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。 $server_addr : 服务器地址,在完成一次系统调用后可以确定这个值。 $server_name : 服务器名称。 $server_port : 请求到达服务器的端口号。
作者:R_X
链接:https://www.jianshu.com/p/403bab8fc34d
标签:匹配,变量,alias,uri,nginx,location,http,root From: https://www.cnblogs.com/hm1825/p/17568527.html