location 有”定位”的意思, 根据Uri来进行不同的定位。
在虚拟主机的配置中,是必不可少的,location可以把网站的不同部分,定位到不同的处理方式上.伪静态,反向代理,负载均衡等等都离不开location。
语法
location (=|~|~*|^~) /pattern {}
例: location ~ /abc {}
括号中的参数成为匹配模式,参数有四种,也可以选择不写, 此时称为一般匹配,匹配模式大致分为以下几种:
location = /pattern {} [精准匹配]
location /pattern {} [一般匹配]
location ~ /pattern {} [正则匹配]
匹配模式
匹配模式有以下几种:
- 精确匹配 (=)
完全匹配指定的 pattern ,且这里的 pattern 被限制成简单的字符串,也就是说这里不能使用正则表达,
精确匹配的请求路径和匹配表达式就是要完全一致。
location = /abc {
#...
}
http://xxx.com/abc # 正好完全匹配
http://xxx.com/ABC # 如果运行 Nginx server 的系统本身对大小写不敏感,比如 Windows ,那么也匹配
http://xxx.com/abc?param1 # 忽略查询串参数(query string arguments),也同样匹配
http://xxx.com/abc/ # 不匹配,因为末尾存在反斜杠(trailing slash),Nginx 不认为这种情况是完全匹配
http://xxx.com/abcde # 不匹配,因为不是完全匹配
- 一般匹配(None)
可以理解为左前缀匹配(like pattern%),这种情况下,匹配那些以指定的 patern 开头的 URI。
location /abc {
#...
}
http://xxx.com/abc # 匹配成功,正好完全匹配。
http://xxx.com/abc/def # 匹配成功,前缀匹配。
http://xxx.com/abc/ # 匹配成功,末尾存在反斜杠也属于匹配范围内。
http://xxx.com/abcd # 匹配成功,仍然是以指定pattern开头。
- 正则匹配 (~, ~, ^~, !~, !~)
对大小写敏感(在window上无效),且 pattern 须是正则表达式。
location ~ ^/abc$ {
#...
}
http://xxx.com/abc # 完全匹配
http://xxx.com/ABC # 不匹配,~ 对大小写是敏感的
http://xxx.com/abc?param1 # 忽略查询串参数(query string arguments),这里就是 /abcd 后面的 ?param1
http://xxx.com/abc/ # 不匹配,因为末尾存在反斜杠(trailing slash),并不匹配正则表达式 ^/abcd$
http://xxx.com/abcd # 不匹配正则表达式 ^/abcd$
~表示正则表达式的意思,*表示不区分大小写,^表示以什么开头,。
- ~ 表示区分大小写的正则匹配,
- ~* 表示区分大小写的正则匹配,
- ^~ 表示URI以某个常规字符串开头,匹配成功会停止后面的搜索。
- !~ 表示区分大小写不匹配的正则
- *!~ 表示不区分大小写不匹配的正则
- 通用匹配 /
任何请求都会匹配到。
- 特殊匹配 @
用于定义一个 Location 块,且该块不能被外部 Client 所访问,只能被 Nginx 内部配置指令所访问,比如 try_files or error_page
匹配的优先级
匹配的优先级大致是越精确就越优先,匹配的优先级如下:
- =
- (None) 前提是 pattern 完全匹配 URI 的情况(不是只匹配 URI 的头部,这点很重要)
- ^~
- ~ 或 ~*
- (None) pattern 匹配 URI 的头部
- 通用匹配/
也就是
(location =) >
(location 完整路径) >
(location ^~ 路径) >
(location ~,~* 正则顺序) >
(location 部分起始路径) >
(/)
示例:
location / {
#...
}
location /image {
#...
}
location ^~ image {
#...
}
location ~ image {
#...
}
如果访问 http://test.com/image/logo.png
此时,上面4个location都会匹配成功,此时会使用到哪一个呢?
根据优先级,真正匹配到的是^~,因为优先级 “^~” > “~” > “None” > “/“。
推荐必须配置的location
#直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说.
#这里是直接转发给后端应用服务器了,也可以是一个静态首页
# 第一个必选规则
location = / {
proxy_pass http://127.0.0.1:88;
}
# 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
# 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 12h;
}
location ~ /\.
{
deny all; # 其他的任意后缀都不让其访问;
}
#第三个规则就是通用规则,用来转发动态请求到后端应用服务器
location /
{
try_files $uri @apache; #try_files 将尝试你列出的文件并设置内部文件指向
}
location @apache
{
internal; # internal指令指定某个location只能被“内部的”请求调用,外部的调用请求会返回”Not found”
proxy_pass http://127.0.0.1:88;
proxy_connect_timeout 300s;
proxy_send_timeout 900;
proxy_read_timeout 900;
proxy_buffer_size 32k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_redirect off;
proxy_hide_header Vary;
proxy_set_header Accept-Encoding '';
proxy_set_header Host $host;
proxy_set_header Referer $http_referer;
proxy_set_header Cookie $http_cookie;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}