location 有”定位”的意思, 根据Uri来进行不同的定位。
在虚拟主机的配置中,是必不可少的,location可以把网站的不同部分,定位到不同的处理方式上.伪静态,反向代理,负载均衡等等都离不开location。

语法

  1. location (=|~|~*|^~) /pattern {}
  2. 例: location ~ /abc {}

括号中的参数成为匹配模式,参数有四种,也可以选择不写, 此时称为一般匹配,匹配模式大致分为以下几种:

  1. location = /pattern {} [精准匹配]
  2. location /pattern {} [一般匹配]
  3. location ~ /pattern {} [正则匹配]

匹配模式

匹配模式有以下几种:

  1. 精确匹配 (=)

完全匹配指定的 pattern ,且这里的 pattern 被限制成简单的字符串,也就是说这里不能使用正则表达,
精确匹配的请求路径和匹配表达式就是要完全一致。

  1. location = /abc {
  2. #...
  3. }
  4. http://xxx.com/abc # 正好完全匹配
  5. http://xxx.com/ABC # 如果运行 Nginx server 的系统本身对大小写不敏感,比如 Windows ,那么也匹配
  6. http://xxx.com/abc?param1 # 忽略查询串参数(query string arguments),也同样匹配
  7. http://xxx.com/abc/ # 不匹配,因为末尾存在反斜杠(trailing slash),Nginx 不认为这种情况是完全匹配
  8. http://xxx.com/abcde # 不匹配,因为不是完全匹配
  1. 一般匹配(None)

可以理解为左前缀匹配(like pattern%),这种情况下,匹配那些以指定的 patern 开头的 URI。

  1. location /abc {
  2. #...
  3. }
  4. http://xxx.com/abc # 匹配成功,正好完全匹配。
  5. http://xxx.com/abc/def # 匹配成功,前缀匹配。
  6. http://xxx.com/abc/ # 匹配成功,末尾存在反斜杠也属于匹配范围内。
  7. http://xxx.com/abcd # 匹配成功,仍然是以指定pattern开头。
  1. 正则匹配 (~, ~, ^~, !~, !~)

对大小写敏感(在window上无效),且 pattern 须是正则表达式。

  1. location ~ ^/abc$ {
  2. #...
  3. }
  4. http://xxx.com/abc # 完全匹配
  5. http://xxx.com/ABC # 不匹配,~ 对大小写是敏感的
  6. http://xxx.com/abc?param1 # 忽略查询串参数(query string arguments),这里就是 /abcd 后面的 ?param1
  7. http://xxx.com/abc/ # 不匹配,因为末尾存在反斜杠(trailing slash),并不匹配正则表达式 ^/abcd$
  8. http://xxx.com/abcd # 不匹配正则表达式 ^/abcd$

~表示正则表达式的意思,*表示不区分大小写,^表示以什么开头,。

  • ~ 表示区分大小写的正则匹配,
  • ~* 表示区分大小写的正则匹配,
  • ^~ 表示URI以某个常规字符串开头,匹配成功会停止后面的搜索。
  • !~ 表示区分大小写不匹配的正则
  • *!~ 表示不区分大小写不匹配的正则
  1. 通用匹配 /

任何请求都会匹配到。

  1. 特殊匹配 @

用于定义一个 Location 块,且该块不能被外部 Client 所访问,只能被 Nginx 内部配置指令所访问,比如 try_files or error_page

匹配的优先级

匹配的优先级大致是越精确就越优先,匹配的优先级如下:

  1. =
  2. (None) 前提是 pattern 完全匹配 URI 的情况(不是只匹配 URI 的头部,这点很重要)
  3. ^~
  4. ~ 或 ~*
  5. (None) pattern 匹配 URI 的头部
  6. 通用匹配/

也就是
(location =) >
(location 完整路径) >
(location ^~ 路径) >
(location ~,~* 正则顺序) >
(location 部分起始路径) >
(/)
示例:

  1. location / {
  2. #...
  3. }
  4. location /image {
  5. #...
  6. }
  7. location ^~ image {
  8. #...
  9. }
  10. location ~ image {
  11. #...
  12. }

如果访问 http://test.com/image/logo.png
此时,上面4个location都会匹配成功,此时会使用到哪一个呢?
根据优先级,真正匹配到的是^~,因为优先级 “^~” > “~” > “None” > “/“。

推荐必须配置的location

  1. #直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说.
  2. #这里是直接转发给后端应用服务器了,也可以是一个静态首页
  3. # 第一个必选规则
  4. location = / {
  5. proxy_pass http://127.0.0.1:88;
  6. }
  7. # 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
  8. # 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
  9. location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
  10. {
  11. expires 30d;
  12. }
  13. location ~ .*\.(js|css)?$
  14. {
  15. expires 12h;
  16. }
  17. location ~ /\.
  18. {
  19. deny all; # 其他的任意后缀都不让其访问;
  20. }
  21. #第三个规则就是通用规则,用来转发动态请求到后端应用服务器
  22. location /
  23. {
  24. try_files $uri @apache; #try_files 将尝试你列出的文件并设置内部文件指向
  25. }
  26. location @apache
  27. {
  28. internal; # internal指令指定某个location只能被“内部的”请求调用,外部的调用请求会返回”Not found”
  29. proxy_pass http://127.0.0.1:88;
  30. proxy_connect_timeout 300s;
  31. proxy_send_timeout 900;
  32. proxy_read_timeout 900;
  33. proxy_buffer_size 32k;
  34. proxy_buffers 4 32k;
  35. proxy_busy_buffers_size 64k;
  36. proxy_redirect off;
  37. proxy_hide_header Vary;
  38. proxy_set_header Accept-Encoding '';
  39. proxy_set_header Host $host;
  40. proxy_set_header Referer $http_referer;
  41. proxy_set_header Cookie $http_cookie;
  42. proxy_set_header X-Real-IP $remote_addr;
  43. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  44. }