Nginx Location

Posted by Cann on August 25, 2017

location

一:正则写法

a 精确匹配,所匹配路径完全相同
    location  = / {
      # 精确匹配 / ,主机名后面不能带任何字符串
      [ configuration A ]
    }
b 对URL路径进行前缀匹配
    location /documents/ {
      # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
      # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
      [ configuration C ]
    }
c 正则匹配
    location ~ /documents/Abc {
      # 匹配任何以 /documents/Abc 开头的地址,匹配符合以后,还要继续往下搜索
      # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
      [ configuration CC ]
    }
d 对URL路径进行前缀匹配,并且在正则之前。(即该匹配成功后,不会再进行后续的正则匹配)
location ^~ /images/ {
  # 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。
  [ configuration D ]
}
e 不区分大小写的正则匹配
location ~* \.(gif|jpg|jpeg)$ {
  # 匹配所有以 gif,jpg或jpeg 结尾的请求
  # 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则
  [ configuration E ]
}

二 :Location匹配优先级

a. 第一优先级:等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项。

b. 第二优先级:^~类型表达式。一旦匹配成功,则不再查找其他匹配项。

c. 第三优先级:正则表达式类型(~ ~*)的优先级次之。如果有多个location的正则能匹配的话,则使用正则表达式最长的那个。

d. 第四优先级:常规字符串匹配类型。按前缀匹配。

Rewrite

一:flag标志位

a. last : 相当于Apache的[L]标记,表示完成rewrite

b. break : 停止执行当前虚拟主机的后续rewrite指令集

last一般写在server和if中,而break一般使用在location中 last不终止重写后的url匹配,即新的url会再从server走一遍匹配流程,而break终止重写后的匹配 break和last都能组织继续执行后面的rewrite指令

c. redirect : 返回302临时重定向,地址栏会显示跳转后的地址

d. permanent : 返回301永久重定向,地址栏会显示跳转后的地址

因为301和302不能简单的只返回状态码,还必须有重定向的URL,这就是return指令无法返回301,302的原因了。

二:全局变量

a. $args这个变量等于请求行中的参数,同$query_string

b. $content_length请求头中的Content-length字段。

c. $content_type请求头中的Content-Type字段。

d. $document_root当前请求在root指令中指定的值。

e. $host请求主机头字段,否则为服务器名称。

f. $http_user_agent客户端agent信息

g. $http_cookie客户端cookie信息

h. $limit_rate这个变量可以限制连接速率。

i. $request_method客户端请求的动作,通常为GET或POST。

j. $remote_addr客户端的IP地址。

k. $remote_port客户端的端口。

l. $remote_user已经经过Auth Basic Module验证的用户名。

m. $request_filename当前请求的文件路径,由root或alias指令与URI请求生成。

n. $schemeHTTP方法(如http,https)。

o. $server_protocol请求使用的协议,通常是HTTP/1.0或HTTP/1.1。

p. $server_addr服务器地址,在完成一次系统调用后可以确定这个值。

q. $server_name服务器名称。

r. $server_port请求到达服务器的端口号。

s. $request_uri包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。

t. $uri不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。

u. $document_uri与$uri相同。例:http://localhost:88/test1/test2/test.php

v. $hostlocalhost

w. $server_port88

x. $request_urihttp://localhost:88/test1/test2/test.php

y. $document_uri/test1/test2/test.php

z. $document_root/var/www/html

A. $request_filename/var/www/html/test1/test2/test.php

三. try_files

try_files指令是按顺序检测文件的存在性,并且返回第一个找到文件的内容,如果第一个找不到就会自动找第二个,依次查找.其实现的是内部跳转

案例1

server {
   listen 8000;
   server_name 121.10.143.66;
   root html;
   index index.html index.php;

   location /abc {
       try_files /4.html /5.html @qwe;  ## 检测文件4.html和5.html,如果存在正常显示,不存在就去查找@qwe值
  }

   location @qwe  {
      rewrite ^/(.*)$   http://www.baidu.com;  ## 跳转到百度页面
}

案例2

server {
   listen 8000;
   server_name 121.10.143.66;
   root html;
   index index.php index.html;

   location /abc {
       try_files $uri /index.php/$uri;  ## 若$uri不存在,则跳转至/index.php/$uri
}

$uri: 当前请求的url。

与rewrite指令不同,如果回退URI不是命名的location那么$args不会自动保留,如果你想保留$args,则必须明确声明。

try_files $uri $uri/ /index.php?q=$uri&$args;

参考文章