Nginx服务器的location指令匹配规则详解
Nginx中的Location指令是NginxHttpCoreModule中重要指令。Location指令,是用来为匹配的URI进行配置,URI即语法中的”/uri/”,可以是字符串或正则表达式。但如果要使用正则表达式,则必须指定前缀。
nginxlocation语法
基本语法:location[=|~|~*|^~]/uri/{…}
- =严格匹配。如果这个查询匹配,那么将停止搜索并立即处理此请求。
- ~为区分大小写匹配(可用正则表达式)
- ~*为不区分大小写匹配(可用正则表达式)
- !~和!~*分别为区分大小写不匹配及不区分大小写不匹配
- ^~如果把这个前缀用于一个常规字符串,那么告诉nginx如果路径匹配那么不测试正则表达式。
Location语法语法:location[=|~|~*|^~]/uri/{…}
注:
1、~ 为区分大小写匹配
2、~*为不区分大小写匹配
3、!~和!~*分别为区分大小写不匹配及不区分大小写不匹配
例子:
location=/{ #matchesthequery/only. #只匹配/查询。 [configurationA] } location/{ #matchesanyquery,sinceallqueriesbeginwith/,butregular #expressionsandanylongerconventionalblockswillbe #matchedfirst. #匹配任何查询,因为所有请求都已/开头。但是正则表达式规则和长的块规则将被优先和查询匹配。 [configurationB] } location^~/images/{ #matchesanyquerybeginningwith/images/andhaltssearching, #soregularexpressionswillnotbechecked. #匹配任何已/images/开头的任何查询并且停止搜索。任何正则表达式将不会被测试。 [configurationC] } location~*.(gif|jpg|jpeg)${ #matchesanyrequestendingingif,jpg,orjpeg.However,all #requeststothe/images/directorywillbehandledby #ConfigurationC. #匹配任何已gif、jpg或jpeg结尾的请求。然而所有/images/目录的请求将使用ConfigurationC。 [configurationD] }
我的添加模式,动静分离
location^~/(images|scripts|styles|upload)/{ root/www/abc.com/www/htdocs; expires30d; } location~*\.(gif|jpg|jpeg|png|css|ico|html)${ root/www/abc.com/www/htdocs; expires30d; }
如果要定义多个location,则可以有2种方式:
使用/:location/{client_max_body_size200m;proxy_connect_timeout30;proxy_set_headerHost$http_host;proxy_set_headerx-forwarded-for$remote_addr;proxy_passhttp://127.0.0.1:8008;}location/tmp/{root/;internal;}采用这种方式,/tmp可以放在/的下面,因为“/是匹配任何查询,但是正则表达式规则和长的块规则将被优先和查询匹配”
使用~/*:location~/tmp/{root/tmp;internal;}location~/*{client_max_body_size20m;proxy_connect_timeout30;fastcgi_passfpass;includefastcgi_params;}采用这种方式,/tmp则必须放在~/*这个前面,因为~是正则匹配的,正则匹配是有顺序的,只要匹配上就不会再往下匹配了。除非在conf中有定义=或者^~,也就是说=和^~的优先级最高,如果匹配上,就不会再去匹配其它的规则了。