转载请注明出处:【Nginx的location用法备忘】http://www.holmesian.org/nginx_location 

 Nginx的配置文件相当的漂亮,配合适当的缩进和约定的格式看起来跟漂亮的代码一样。

Nginx中最基本也是最实用的一个命令就是location了,location必须放在server中,现在摘录一些相关的文档以备忘。

 

基本语法

location [=|~|~*|^~] /uri/ {  }

= 严格匹配。如果这个查询匹配,那么将停止搜索并立即处理此请求。

~ 为区分大小写匹配

~* 为不区分大小写匹配

!~和!~*分别为区分大小写不匹配及不区分大小写不匹配

^~ 如果把这个前缀用于一个常规字符串,那么告诉nginx 如果路径匹配那么不测试正则表达式。

 

例如:

location = / { # 只匹配 / 查询。

location / { # 匹配任何查询,因为所有请求都已 / 开头。但正则表达式规则和长的块规则将被优先和查询匹配。

location ^~ /p_w_picpaths/ { # 匹配任何已 /p_w_picpaths/ 开头的任何查询并且停止搜索。任何正则表达式将不会被测试。

location ~* \.(gif|jpg|jpeg)$ { # 匹配任何以 gif、jpg 或 jpeg 结尾的请求。

++ 文件及目录匹配

* -f和!-f用来判断是否存在文件

* -d和!-d用来判断是否存在目录

* -e和!-e用来判断是否存在文件或目录

* -x和!-x用来判断文件是否可执行

++ 一些可用的全局变量

 
  1. $args
  2.  
  3. $content_length
  4.  
  5. $content_type
  6.  
  7. $document_root
  8.  
  9. $document_uri
  10.  
  11. $host
  12.  
  13. $http_user_agent
  14.  
  15. $http_cookie
  16.  
  17. $limit_rate
  18.  
  19. $request_body_file
  20.  
  21. $request_method
  22.  
  23. $remote_addr
  24.  
  25. $remote_port
  26.  
  27. $remote_user
  28.  
  29. $request_filename
  30.  
  31. $request_uri
  32.  
  33. $query_string
  34.  
  35. $scheme
  36.  
  37. $server_protocol
  38.  
  39. $server_addr
  40.  
  41. $server_name
  42.  
  43. $server_port
  44.  
  45. $uri
 

 

 

Location必须放在server中

这个指令随URL不同而接受不同的结构。你可以配置使用常规字符串和正则表达式。如果使用正则表达式,你必须使用 ~* 前缀选择不区分大小写的匹配或者 ~ 选择区分大小写的匹配。

确定 哪个location 指令匹配一个特定指令,常规字符串第一个测试。常规字符串匹配请求的开始部分并且区分大小写,最明确的匹配将会被使用(查看下文明白 nginx 怎么确定它)。然后正则表达式按照配置文件里的顺序测试。找到第一个比配的正则表达式将停止搜索。如果没有找到匹配的正则表达式,使用常规字符串的结果。

有两个方法修改这个行为。第一个方法是使用 “=”前缀,将只执行严格匹配。如果这个查询匹配,那么将停止搜索并立即处理这个请求。例子:如果经常发生”/”请求,那么使用 “location = /” 将加速处理这个请求。

第二个是使用 ^~ 前缀。如果把这个前缀用于一个常规字符串那么告诉nginx 如果路径匹配那么不测试正则表达式。

而且它重要在于 NGINX 做比较没有 URL 编码,所以如果你有一个 URL 链接’/p_w_picpaths/%20/test’ , 那么使用 “p_w_picpaths/ /test” 限定location。

总结,指令按下列顺序被接受:
1. = 前缀的指令严格匹配这个查询。如果找到,停止搜索。
2. 剩下的常规字符串,长的在前。如果这个匹配使用 ^~ 前缀,搜索停止。
3. 正则表达式,按配置文件里的顺序。
4. 如果第三步产生匹配,则使用这个结果。否则使用第二步的匹配结果。

例子:

location = / {
# 只匹配 / 查询。
[ configuration A ]
}

location / {
# 匹配任何查询,因为所有请求都已 / 开头。但是正则表达式规则和长的块规则将被优先和查询匹配。
[ configuration B ]
}

location ^~ /p_w_picpaths/ {
# 匹配任何已 /p_w_picpaths/ 开头的任何查询并且停止搜索。任何正则表达式将不会被测试。
[ configuration C ]
}

location ~* \.(gif|jpg|jpeg)$ {
# 匹配任何已 gif、jpg 或 jpeg 结尾的请求。然而所有 /p_w_picpaths/ 目录的请求将使用 Configuration C。
[ configuration D ]
}

例子请求:

/ -> configuration A

/documents/document.html -> configuration B

/p_w_picpaths/1.gif -> configuration C

/documents/1.jpg -> configuration D

注意:按任意顺序定义这4个配置结果将仍然一样。