语法
location [=|~|~*|^~] /uri/ {...}
上下文: server
此命令随URL 不同而接受不同的结构. 可以配置使用常规字符串和正则表达式. 若使用正则表达式, 则必须使用~*
前缀(选择不区分大小写的匹配) 或~
前缀(区分大小写的匹配)
=
表示uri
以某个常规字符串开头, 理解为匹配url 路径即可. nginx 不对url 做编码, 因此请求为/static/%20%/aa
可以被规则^~ /static/ /aa
(有空格) 匹配到.~
表示区分大小写的正则匹配~*
表示不区分大小写的正则匹配!~
和!~*
分别为区分大小写不匹配 和 不区分大小写不匹配 的正则/
通用匹配, 任何请求都会匹配到
多个location
配置的情况下, 匹配顺序为:
先匹配=
, 其次匹配^~
, 再匹配按文件中顺序的正则匹配, 最后匹配/
. 当有匹配成功的时候, 停止匹配, 按当前匹配规则处理请求.
例1:
location = / {
# 规则A
}
location = /login {
# 规则B
}
location ^~ /static {
# 规则C
}
location ~ \.(gif|jpg|png|js|css)$ {
# 规则D
}
location ~* \.png$ {
# 规则E
}
location !~ \.xhtml$ {
# 规则F
}
location !~* \.xhtml$ {
# 规则G
}
location / {
# 规则H
}
产生效果如下:
- 访问
/
根目录, 如http://localhost/
将匹配规则A - 访问
http://localhost/login
将匹配规则B;http://localhost/register
将匹配规则H - 访问
http://localhost/static/a.html
将匹配规则C - 访问
http://localhost/a.png
讲匹配规则D 和规则E, 但规则D 顺序优先, 规则E 不起作用 - 访问
http://localhost/static/c.png
优先匹配到规则C - 访问
http://localhost/a.PNG
将匹配规则E - 访问
http://localhost/a.xhtml
不会匹配到规则F 和规则G,http://localhost/a.XHTML
不会匹配到规则G - 访问
http://localhost/category/id/1111
匹配到规则H, 因为以上规则都不匹配, 这个时候应该是nginx 转发给后端应用服务器, 如FastCGI(php), tomcat(jsp), nginx 作为反向代理服务器存在.
所以实际使用中, 通常有至少三个匹配规则定义, 如下:
# 第一个必选规则 直接匹配网站根, 通过域名访问网站首页比较频繁, 使用这个会加速处理; 这里直接转发给后端应用服务器了, 也可以是一个静态首页
location = / {
proxy_pass http://tomcat:8080/index
}
# 第二个必选规则 处理静态文件请求, 这是nginx 作为http 服务器的强项. 有如下两种配置模式, 目录匹配或后缀匹配, 任选其一或搭配使用
location ^~ /static/ {
root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}
# 第三个必选规则 通用规则, 用来转发动态请求到后端应用服务器. 非静态文件请求就默认是动态请求.
location / {
proxy_pass http://tomcat:8080/
}