lijm1522 发表于 2018-11-16 11:54:08

Nginx的location用法备忘

  转载请注明出处:【Nginx的location用法备忘】http://www.holmesian.org/nginx_location
  Nginx的配置文件相当的漂亮,配合适当的缩进和约定的格式看起来跟漂亮的代码一样。
  Nginx中最基本也是最实用的一个命令就是location了,location必须放在server中,现在摘录一些相关的文档以备忘。
  基本语法
  location [=|~|~*|^~] /uri/ { … }
  = 严格匹配。如果这个查询匹配,那么将停止搜索并立即处理此请求。
  ~ 为区分大小写匹配
  ~* 为不区分大小写匹配
  !~和!~*分别为区分大小写不匹配及不区分大小写不匹配
  ^~ 如果把这个前缀用于一个常规字符串,那么告诉nginx 如果路径匹配那么不测试正则表达式。
  例如:
  location = / { # 只匹配 / 查询。
  location / { # 匹配任何查询,因为所有请求都已 / 开头。但正则表达式规则和长的块规则将被优先和查询匹配。
  location ^~ /images/ { # 匹配任何已 /images/ 开头的任何查询并且停止搜索。任何正则表达式将不会被测试。
  location ~* \.(gif|jpg|jpeg)$ { # 匹配任何以 gif、jpg 或 jpeg 结尾的请求。
  ++ 文件及目录匹配
  * -f和!-f用来判断是否存在文件
  * -d和!-d用来判断是否存在目录
  * -e和!-e用来判断是否存在文件或目录
  * -x和!-x用来判断文件是否可执行
  ++ 一些可用的全局变量

[*]$args
[*]
[*]$content_length
[*]
[*]$content_type
[*]
[*]$document_root
[*]
[*]$document_uri
[*]
[*]$host
[*]
[*]$http_user_agent
[*]
[*]$http_cookie
[*]
[*]$limit_rate
[*]
[*]$request_body_file
[*]
[*]$request_method
[*]
[*]$remote_addr
[*]
[*]$remote_port
[*]
[*]$remote_user
[*]
[*]$request_filename
[*]
[*]$request_uri
[*]
[*]$query_string
[*]
[*]$scheme
[*]
[*]$server_protocol
[*]
[*]$server_addr
[*]
[*]$server_name
[*]
[*]$server_port
[*]
[*]$uri
  Location必须放在server中
  这个指令随URL不同而接受不同的结构。你可以配置使用常规字符串和正则表达式。如果使用正则表达式,你必须使用 ~* 前缀选择不区分大小写的匹配或者 ~ 选择区分大小写的匹配。
  确定 哪个location 指令匹配一个特定指令,常规字符串第一个测试。常规字符串匹配请求的开始部分并且区分大小写,最明确的匹配将会被使用(查看下文明白 nginx 怎么确定它)。然后正则表达式按照配置文件里的顺序测试。找到第一个比配的正则表达式将停止搜索。如果没有找到匹配的正则表达式,使用常规字符串的结果。
  有两个方法修改这个行为。第一个方法是使用 “=”前缀,将只执行严格匹配。如果这个查询匹配,那么将停止搜索并立即处理这个请求。例子:如果经常发生”/”请求,那么使用 “location = /” 将加速处理这个请求。
  第二个是使用 ^~ 前缀。如果把这个前缀用于一个常规字符串那么告诉nginx 如果路径匹配那么不测试正则表达式。
  而且它重要在于 NGINX 做比较没有 URL 编码,所以如果你有一个 URL 链接’/images/%20/test’ , 那么使用 “images/ /test” 限定location。
  总结,指令按下列顺序被接受:
  1. = 前缀的指令严格匹配这个查询。如果找到,停止搜索。
  2. 剩下的常规字符串,长的在前。如果这个匹配使用 ^~ 前缀,搜索停止。
  3. 正则表达式,按配置文件里的顺序。
  4. 如果第三步产生匹配,则使用这个结果。否则使用第二步的匹配结果。
  例子:
  location = / {
  # 只匹配 / 查询。
  [ configuration A ]
  }
  location / {
  # 匹配任何查询,因为所有请求都已 / 开头。但是正则表达式规则和长的块规则将被优先和查询匹配。
  [ configuration B ]
  }
  location ^~ /images/ {
  # 匹配任何已 /images/ 开头的任何查询并且停止搜索。任何正则表达式将不会被测试。
  [ configuration C ]
  }
  location ~* \.(gif|jpg|jpeg)$ {
  # 匹配任何已 gif、jpg 或 jpeg 结尾的请求。然而所有 /images/ 目录的请求将使用 Configuration C。
  [ configuration D ]
  }
  例子请求:
  / -> configuration A
  /documents/document.html -> configuration B
  /images/1.gif -> configuration C
  /documents/1.jpg -> configuration D
  注意:按任意顺序定义这4个配置结果将仍然一样。

页: [1]
查看完整版本: Nginx的location用法备忘