官方文档:http://nginx.org/en/docs/http/ngx_http_core_module.html#locationhtml
Syntax: | location [ = | ~ | ~* | ^~ ] uri { ... }nginx location @name { ... }正则表达式 |
Default: | — |
Context: | server, location |
根据请求uri来设置配置app
进行匹配的目标是规范化的URI,规范化的URI是指在解码“%XX” 形式编码的文本、解析相对路径符号 “.” 和 “..”,以及将重复斜杠压缩为单斜杠以后的URI。memcached
一个location能够由带前缀的字符串或者正则表达式来定义。正则表达式使用前置的“~*”修饰符 (不区分大小写匹配),或者 “~” 修饰符(区分大小写匹配)来指定。为了找到与指定request匹配的location,Nginx首先使用前缀字符串定义的location进行匹配。其中,选择并记住匹配前缀最长的位置。 而后按正则表达式在配置文件中出现的顺序检查它们。 正则表达式的搜索在第一次匹配时终止,并使用相应的配置。若是没有找到与正则表达式匹配的,则使用前面提到的前缀位置的配置。编码
除了下面提到的一些例外,位置块能够嵌套。spa
对于不区分大小写的操做系统,例如macOS和Cygwin,与前缀字符串匹配会忽略大小写(0.7.7)。可是,比较仅限于一个字节区域设置。操作系统
正则表达式能够包含捕获(0.7.40),稍后能够在其余指令中使用。.net
正则表达式能够包含捕获(0.7.40),稍后能够在其余指令中使用。code
若是最长前缀字符串匹配的location具备“^ ~”修饰符,那么正则表达式不检查。
此外,使用“ =”修饰符能够定义URI和位置的精确匹配。若是找到彻底匹配,则搜索终止。例如,若是/频繁发生“ ”请求,则定义“ location = /”将加速这些请求的处理,由于搜索在第一次比较以后当即终止。这样的位置显然不能包含嵌套位置。
在 0.7.1 到 0.8.41的版本中, 若是请求与前缀位置匹配而没有 “=” 和“^~” 修饰符,则搜索也会终止,而且不会检查正则表达式。
让咱们用一个例子来讲明以上内容:
location = / { configuration A } location / { configuration B } location /documents/ { configuration C } location ^~ /images/ { configuration D } location ~* \.(gif|jpg|jpeg)$ { configuration E }
“ /”请求将匹配配置A,“ /index.html”请求将匹配配置B,“ /documents/document.html”请求将匹配配置C,“ /images/1.gif”请求将匹配配置D,“ /documents/1.jpg”请求将匹配配置E。
@”前缀定义命名位置。这样的位置不用于常规请求处理,而是用于请求重定向。它们不能嵌套,也不能包含嵌套位置。
若是位置由以斜杠字符结尾的前缀字符串定义,而且请求由 proxy_pass, fastcgi_pass, uwsgi_pass,scgi_pass, memcached_pass或 grpc_pass之一处理,则执行特殊处理。为了响应URI等于此字符串但没有尾部斜杠的请求,带有代码301的永久重定向将返回到请求的URI,并附加斜杠。若是不须要,能够像下面这样定义URI和位置的彻底匹配:
location /user/ { proxy_pass http://user.example.com; } location = /user { proxy_pass http://login.example.com; }
(非官方补充:若是/user配置与/user/相同,就不用专门定义= /user)