这是 Nginx 学习总结的第三篇,上一篇介绍到了 Nginx 学习总结(2) —— 基本配置,这一篇会对Location 模块
做一些总结。我们知道,Location 模块
主要是用于针对某些特定的 URL 进行配置,可以由前缀字符串定义,也可以由正则表达式定义。
Location 匹配规则
location = /test.png {
# 精确匹配
[ configuration A ]
}
location / {
# 通用匹配,但是正则表达式和最长字符串会优先被匹配
[ configuration B ]
}
location /documents/ {
# 前缀字符串匹配
# 匹配任何以 /documents/ 开头的请求
# 只有后面的正则表达式没有匹配到时,该配置才会被采用
[ configuration C ]
}
location ^~ /images/ {
# 前缀字符串匹配
# 匹配任何以 /images/ 开头的请求,匹配成功以后,会停止搜索后面的正则表达式匹配
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
# 正则表达式匹配,匹配所有以 gif,jpg,jpeg 结尾的请求
# 然而,所有请求 /images/ 下的图片会被 configuration D 处理,因为 ^~ 指令,匹配不到这一条规则
[ configuration E ]
}
location /images/abc/ {
# 前缀字符串匹配
# 只有去掉 configuration D 才能被匹配到
[ configuration F ]
}
-
=
精确匹配; -
^~
提高前缀字符串的匹配优先级; -
~
区分大小写的正则表达式匹配; -
~*
不区分大小写的正则表达式匹配; -
/
通用匹配(因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求),如果没有其它匹配,任何请求都会匹配到。
默认情况, Nginx 先进行前缀字符串匹配,然后进行正则表达式匹配:如果前缀字符串匹配到了,并且前缀字符串有^~
,就不继续往下匹配正则表达式;如果没有这个^~
,即使前缀匹配到了,也要进行正则表则式匹配,如果正则表达式匹配到了,就是用正则表达式的,没有就是用前缀字符串匹配到的路径。总结如下:
匹配优先级:精确匹配 >(^~) > 正则匹配 > 字符串(长 > 短)
Location 配置应用
1. 常用使用规则
# 第一个必选规则
# 直接匹配网站根目录,通过域名访问网站首页比较频繁,使用这个会加速处理,比如官网首页
location = / {
root /usr/share/nginx/html;
index index.php index.html index.htm;
}
# 第二个必选规则
# 处理静态文件请求,有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
expires 7d; # 用来设置 HTTP 应答中的 Expires 和 Cache-Control 的头标时间,来告诉浏览器访问这个静态文件时,不用再去请求服务器,直接从本地缓存读取就可以了
}
location ^~ /public/ {
root /usr/share/nginx/html/laravel/public;
expires 7d;
}
# 第三个必选规则
# 用来转发动态请求到后端应用服务器
location / {
root /usr/share/nginx/html;
index index.php index.html index.htm;
}
2. 配置临时跳转
有时,需要将原来的 URL 请求跳转到新的 URL 链接,但又不想使原来的 URL 失效,比如访问 http://jochen.com/test
时,需要跳转到 http://jochen.com/
,此时可以配置一个跳转:
location = /test/ {
return 302 http://jochen.com/;
}
3. 配置访问控制
有时,我们需要对访问做一些限制。比如,Nginx 的 ngx_http_stub_status_module
模块(该模块不是默认安装的,可以使用 --with-http_stub_status_module
编译安装)提供了查看 Nginx 运行的基本状态信息,我们只想让部分 IP 的人可以查看,此时可以配置一个访问控制:
location /nginx-status {
# 在1.7.5版本之前,使用 stub_status on; 指令
stub_status;
allow 127.0.0.1;
allow 192.168.4.220;
deny all;
}
4. 列出目录
Nginx 默认是不允许列出整个目录的。如需此功能,我们可以通过一下配置开启:
location / {
root /usr/share/nginx/html;
autoindex on; # 开启目录自动索引
autoindex_exact_size off; # 默认为on,显示出文件的确切大小,单位是bytes。改为off后,显示出文件的大概大小,单位是kB或者MB或者GB
autoindex_localtime on; # 默认为off,显示的文件时间为GMT时间。改为on后,显示的文件时间为文件的服务器时间
}
参考文章