location
location 主要是根据 Server 匹配到的请求路径和关键字去响应和处理。
语法:
location optional_modifier location_match { ... }
location @name { ... }
其中:optional_modifier 是匹配条件,location_match 是匹配的样式,{}
是要执行的操作。匹配条件主要有两种: 正则/前缀字符。
匹配规则
正则匹配
类型 | 含义 | 匹配方式 | 优先级 | 样式 |
---|---|---|---|---|
~ | 普通正则-敏感 | 正则符号 | 3 | location ~.(jpe?g)$ {} |
~* | 普通正则-不敏感 | 正则符号 | 3 | location ~.(jpe?g)$ {} |
普通匹配
类型 | 含义 | 匹配方式 | 优先级 | 样式 |
---|---|---|---|---|
= | 精确匹配 | 前缀 | 1 | location = /image {} |
^~ | 优先匹配 | 前缀 | 2 | location ^~ /page {} |
@ | 内部重定向 | 前缀 | location @name {} | |
/ | 通用匹配 | 前缀 | 4 | location / {} |
使用原则:
前提:根据请求 url,获取 uri 即除了域名/IP之外的部分,用于 location 匹配
- 如果有精确匹配,即
=/路径
,找到匹配项后,结束匹配。 location = 路径 {}
或者location 完整路径 {}
- 如果有优先匹配,即
^~
,找到匹配项后,结束匹配。 - location ^~ 路径。如果有正则匹配,即
~|!~|~|!~
,找到匹配项后,不会终止继续匹配,直到找到合适的 - location ~ 正则字符 {} ,如果匹配到多个,则使用location_match最长的。
常见示例:
location = / {
location ~ \.(gif|jpg|png|js|css)$ {
location !~ \.xhtml$ {
\ # 精确规则A # 正则规则D # 通用规则G
}
}
}
location = /login {
location ~ \.png$ {
location / {
\ # 精确规则B # 正则规则E # 通用规则H
}
}
}
location ^~ /static/ {
location !~ \.xhtml$ {
\ # 优先规则C # 正则规则F
}
}
访问效果如下:
访问根目录/, 比如 http://a.com/
将匹配规则A
访问 http://a.com/login
将匹配规则B
访问 http://a.com/static/a.html
将匹配规则C
访问 http://a.com/a.gif
, http://a.com/b.png
规则D和E均适合,按顺序优先使用规则D,而 http://a.com/static/c.png
则优先匹配到规则C
访问 http://a.com/a.PNG
则匹配规则E,因为规则E不区分大小写。
访问 http://a.com/a.XHTML
使用规则F。
访问 http://a.com/category/id/1111
则最终匹配到规则H。
@name示例
@
用来定义一个命名 location 。主要用于内部重定向,不能用来处理正常的请求。其用法如下:
location / {
try_files $uri $uri/ @custom
}
location @custom {
\ # ...do something
\ # custom 命名的 location 中不能再嵌套其它的命名 location
}
关于 URL 尾部的 / 有如下注意事项:
- location 中的 location_match 字符有无"/"不受影响。/user/ 等同 /user。
- 对于访问网站域名(http://sswang.com/),尾部有无
/
不受影响。因为浏览器会自动补全/
。 - 对于访问网站域名后面的路径(http://sswang.com/other/)。尾部的
/
很重要。
URL尾部的 /
表示目录,没有 /
表示文件,而且文件找不到的话,会发生重定向。
/other/
:表示服务器会自动去该目录下找对应的默认文件。
/other
:表示服务器会先去找 other 文件,找不到的话会将 other 当成目录,重定向到 /other/,去该目录下找默认文件。
location 常见动作
在 location 内部常用的功能属性非常多,常见的基本属性、临时跳转、访问控制、目录列表等。
基本属性
location / {
root /var/www/html; # 指定响应请求的文件所在路径
index index.php index.html index.htm; # 指定响应请求的默认文件名称
expires 7d; # 指定响应请求的文件过期时间,一般用于静态文件
try_files $uri $uri/ =404; # 如果 root 指定的路径下有查找的文件,就返回,否则报错
}
临时跳转
location = /test/ {
return 302 http://sswang.com/; # 访问旧url的时候,临时跳转到新url,两个url均不失效
}
访问控制
location /nginx-status {
stub_status on; # 开启 nginx 的状态页面,默认关闭
allow 192.168.8.14; # 允许的访问地址
deny all; # 默认进制所有访问
}
注意:
该功能依赖于 ngx_http_stub_status_module 模块(默认没有安装,需要定制化安装)
目录列表
location /upload {
alias /var/www/upload; # 指定查看文件列表路径(绝对路径)
autoindex on; # 开启目录自动索引
autoindex_exact_size off; # 默认on,显示文件确切大小(bytes)。off表示显示文件的大概大小(kB/MB/...)
autoindex_localtime on; # 默认off,显示的文件时间为GMT时间。on表示显示文件的服务器时间
}
注意:
该 alias 指定的目录下,不允许出现 index 属性指定的文件。
root VS alias
root 和 alias 所起的作用都是指定响应请求所用文件的路径,只是他们有些许的区别
root 表示 location 匹配内容的相对路径
alias 表示 一个绝对路径,而且必须以 /
结尾
一般情况下,在 location /中配置 root,在 location /other 中配置 alias
效果一: 效果二:
location /img/ { location /img/ {
alias /var/www/image/; root /var/www/image;
} }
效果一:访问 http://localhost/img/ ,nginx 找 /var/www/image/ 目录下的文件
效果二:访问 http://localhost/img/ ,nginx 找 /var/www/image/img/ 目录下的文件