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后,显示的文件时间为文件的服务器时间
}

参考文章

  1. nginx 服务器安装及配置文件详解
  2. 前端工程师学习 Nginx 入门篇
  3. Module ngx_http_stub_status_module

PHP 学习总结
研读官网文档和网络优秀个人文章,对 PHP 编程相关作出学习总结。

Stay hungry, stay foolish.

846 声望
84 粉丝
0 条评论
推荐阅读
PHP 微服务集群搭建
微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间相互协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务和服务之间采用轻量级的通信机制相互沟通。每个服务...

Jochen112阅读 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 包时绑定某个端...

spacewander4阅读 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

Stay hungry, stay foolish.

846 声望
84 粉丝
宣传栏