Nginx 学习总结(3)—— Location 模块
这是 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后,显示的文件时间为文件的服务器时间
}
参考文章
PHP 学习总结
研读官网文档和网络优秀个人文章,对 PHP 编程相关作出学习总结。
被 1 篇内容引用
推荐阅读
PHP 微服务集群搭建
微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间相互协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务和服务之间采用轻量级的通信机制相互沟通。每个服务...
Jochen赞 112阅读 14.2k评论 6
如何选择适合你的微服务 API 网关:对比 Kong、APISIX、Tyk、Apigee 和其他网关
API 网关并非一个新兴的概念,在十几年前就已经存在了,它的作用主要是作为流量的入口,统一的处理和业务相关的请求,让请求更加安全、快速和准确的得到处理。它有以下传统的功能:
API7_技术团队赞 8阅读 8.6k评论 2
有了 NGINX 和 Kong,为什么还需要 Apache APISIX?
2021 年 5 月,云原生社区技术沙龙·广州站,API7.ai(支流科技)联合创始人 & CTO,Apache APISIX PMC 王院生在活动上做了《有了 NGINX 和 Kong,为什么还需要 Apache APISIX》的分享,以下是现场分享的文字版。...
API7_技术团队赞 1阅读 4.2k
Nginx 配置常用参数,看这一篇就够了
最近在全面学习Nginx,当作笔记了,如有错误,欢迎指出或深入交流。主模块 {代码...} 事件模块 {代码...} http部分 {代码...} 部分参数详细说明server_name {代码...} location {代码...} location表达式类型 {代...
开源到赞 2阅读 1.9k
化虹为桥 - Nginx 如何代理 UDP “连接”
众所周知,UDP 并不像 TCP 那样是基于连接的。但有些时候,我们需要往一个固定的地址发送多个 UDP 来完成一个 UDP 请求。为了保证服务端能够知道这几个 UDP 包构成同一个会话,我们需要在发送 UDP 包时绑定某个端...
spacewander赞 4阅读 1.6k
Nginx unexpected end of file 配置证书遇到问题,如何解决?
通过 letsencrypt 申请证书后,默认服务器安装了 Nginx 1.8 发现,在默认的 /etc/nginx/sites-enabled/default 内容配置 SSL 的 site.com.key 后。重启 Nginx 出现一下错误:
程序员泥瓦匠赞 1阅读 1.2k
mac M1 nginx配置文件位置
mac nginx配置的原位置/usr/local/etc/nginx/nginx.confmac M1 nginx配置位置/usr/local/Homebrew/etc/nginx/nginx.confnginx -t 查看位置
寿兽阅读 3k
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。