Nginx中的一些匹配顺序

  Nginx中常常须要作各类配置,总结以下:nginx

  一、server_name配置正则表达式

  nginx中的server_name指令主要用于配置基于名称虚拟主机,同一个Nginx虚拟主机中,能够绑定多个server_name,各个域名用空格隔开便可。以下:  浏览器

server
{
    listen       80;
    server_name  test.com www.test.com;
    。。。 。。。
}

  若是server_name有多个,那么经过代码如$_SERVER["SERVER_NAME"]获取的始终将是Nginx server_name配置中的第一个域名,第一个域名就至关于Apache虚拟主机配置中的ServerName,后面的域名就至关于Apache的ServerAlias。spa

  若是nginx中有多个server块,那么请求匹配server_name的顺序以下:code

  首先匹配准确的server_name,如:server_name  test.com www.test.com;server

  而后匹配以*通配符开始的server_name,如:server_name  *.test.com;blog

  而后匹配以*通配符结束的server_name,如:server_name  www.test.*;域名

  最后匹配正则表达式形式的server_name,如:server_name ~^(?<www>.+)\.test\.com$;it

  以上只有有一项匹配到之后就会中止搜索。io

  二、Location配置

  location的语法规则以下: location [=|~|~*|^~] /uri/ { … }.

  在nginx中location分为两类:普通location和正则location。普通 location ”是以“ = ”或“ ^~ ”为前缀或者没有任何前缀的 /uri/,包括“/”;“正则 location ”是以“ ~ ”或“ ~* ”为前缀的 /uri/ 。

  那么若是一个 server 块中编写了多个 location 的时候,Nginx对于客户端请求匹配顺序如何呢?

  官网说明以下:先匹配普通location,取的最大前缀匹配,再匹配正则location,若是匹配到则按照正则匹配,若是有多个正则能够匹配到,则按照第一个匹配结果处理,若是正则匹配失败则使用普通location的最大前缀匹配。Nginx也设置了几种机制能够打断这种顺序,分别是“^~ ”、“= ”或者location精确匹配。

  简单的讲顺序以下:

  首先普通location“=”精确匹配;

  而后普通location的URL精确匹配;

  而后普通location”^~"配置;

  而后正则匹配;

  而后其余普通location匹配;

  最后“/”通用匹配

  三、Rewirte配置

  rewrite指令的最后一项参数为flag标记,flag标记有一下四种,说明一下:

  1> last

  标记在本条rewrite规则执行完毕后,会对其所在server{......}标签从新发起请求。使用last实现URI重写后,浏览器地址栏不变。使用alias指令必须用last标记。

  2> break

  标记在本条规则匹配完成后,终止匹配,再也不匹配后面的规则。使用break实现URI重写后,浏览器地址栏不变。使用proxy_pass指令时,须要使用break标记。

  3> redirect

  返回302临时重定向,浏览器地址会显示跳转后的URL地址。

  4> permanent

  返回301永久重定向,浏览器地址会显示跳转后的URL地址。

相关文章
相关标签/搜索