Nginx servername匹配规则都有什么?
off999 2025-03-24 18:58 26 浏览 0 评论
Nginx 的 server_name 指令用于配置虚拟主机,它决定了 Nginx 如何根据客户端请求的 Host 请求头来选择哪个 server 块来处理请求。 Nginx 的 server_name 匹配规则有以下几种,并按照优先级顺序进行匹配:
1. 精确匹配 (Exact Match)
- 规则: server_name 指令中直接写明完整的域名或 IP 地址。
- 优先级: 最高。
- 示例:
- nginx复制代码
- server { listen 80; server_name example.com; # ... } server { listen 80; server_name www.example.com; # ... } server { listen 80; server_name 192.168.1.100; # ... } 当请求的 Host 头完全匹配 example.com、www.example.com 或 192.168.1.100 时,对应的 server 块会被选中。
2. 通配符匹配 (Wildcard Match)
通配符匹配允许使用 * 字符来匹配多个域名。Nginx 支持两种类型的通配符匹配:
- 前缀通配符 (Leading Wildcard): * 位于域名的开头,匹配任意前缀的域名。
- 规则: server_name 指令以 *. 开头。
- 优先级: 低于精确匹配,高于后缀通配符和正则表达式匹配。
- 示例:
- nginx复制代码
- server { listen 80; server_name *.example.com; # 匹配 example.com 的所有子域名,如 blog.example.com, api.example.com 等 # ... } 请求 Host 头为 blog.example.com、api.example.com 等都会匹配到这个 server 块。
- 后缀通配符 (Trailing Wildcard): * 位于域名的末尾,匹配任意后缀的域名。
- 规则: server_name 指令以 .* 结尾。
- 优先级: 低于精确匹配和前缀通配符匹配,高于正则表达式匹配。
- 示例:
- nginx复制代码
- server { listen 80; server_name www.example.*; # 匹配 www.example.com, www.example.net, www.example.org 等 # ... } 请求 Host 头为 www.example.com、www.example.net 等都会匹配到这个 server 块。
通配符匹配的注意事项:
- 只匹配一个层级: 通配符 * 只能匹配一个层级的域名部分。例如,*.example.com 可以匹配 blog.example.com,但不能匹配 a.b.example.com。
- 最长匹配原则: 当多个通配符 server_name 都可能匹配时,Nginx 会选择 最长 的通配符匹配。例如,如果同时配置了 *.example.com 和 *.com,对于 blog.example.com 的请求,会优先匹配 *.example.com。
3. 正则表达式匹配 (Regular Expression Match)
- 规则: server_name 指令以 ~ 开头,后面跟正则表达式。
- 优先级: 最低。
- 示例:
- nginx复制代码
- server { listen 80; server_name ~^www\d+\.example\.com$; # 匹配 www1.example.com, www2.example.com, www123.example.com 等 # ... } server { listen 80; server_name ~^(?
.+)\.example\.net$; # 使用命名捕获组 # ... } - ~^www\d+\.example\.com$: 这个正则表达式匹配以 www 开头,后面跟着一个或多个数字,然后是 .example.com 的域名。
- ~^(?
.+)\.example\.net$: 这个正则表达式使用了命名捕获组 (? .+),可以将匹配到的子域名部分提取出来,在 server 块内部可以使用 $subdomain 变量引用。
正则表达式匹配的注意事项:
- 性能影响: 正则表达式匹配相比精确匹配和通配符匹配,性能消耗更高,因为需要进行正则运算。
- 语法: 正则表达式需要遵循 PCRE (Perl Compatible Regular Expressions) 语法。
- 命名捕获组: 可以使用命名捕获组 (?
pattern) 来提取匹配到的部分,方便在 server 块内部使用。
匹配优先级顺序总结 (从高到低):
- 精确匹配 (Exact Match)
- 最长前缀通配符匹配 (Longest Prefix Wildcard Match),例如 *.example.com 优先于 *.com
- 最长后缀通配符匹配 (Longest Suffix Wildcard Match),例如 www.example.* 优先于 www.*
- 第一个匹配的正则表达式 (First Matching Regular Expression),按照配置文件中 server 块出现的顺序进行匹配。
default_server 指令
如果没有任何 server_name 匹配到请求的 Host 头,Nginx 会使用 默认服务器 (default server) 来处理请求。
- 如何设置默认服务器: 在 listen 指令中添加 default_server 参数。
- nginx复制代码
- server { listen 80 default_server; # 设置为默认服务器 server_name _; # 可以使用 _ 或其他无效域名作为 server_name,表示不匹配任何域名 # ... }
- 默认服务器的选择:如果在 listen 指令中显式指定了 default_server,则该 server 块成为默认服务器。如果没有显式指定 default_server,则 配置文件中第一个 监听相同端口和协议的 server 块会被作为默认服务器。
最佳实践和建议:
- 优先使用精确匹配: 对于已知的域名,尽量使用精确匹配,以提高性能和匹配效率。
- 合理使用通配符: 对于子域名较多的情况,可以使用通配符简化配置。
- 谨慎使用正则表达式: 正则表达式匹配性能较低,只在必要时使用,并尽量写高效的正则表达式。
- 明确设置 default_server: 建议显式设置 default_server,避免意外的默认服务器选择,并可以用于处理未匹配到任何 server_name 的请求,例如返回错误页面或重定向。
- 避免 server_name 重叠: 尽量避免 server_name 配置出现重叠,导致匹配规则混乱。可以使用 nginx -t 命令检查配置文件是否有语法错误和潜在的配置问题。
- 测试配置: 修改 server_name 配置后,务必使用 nginx -t 命令测试配置是否正确,并重启或重新加载 Nginx 服务。
总结:
理解 Nginx 的 server_name 匹配规则对于配置虚拟主机至关重要。掌握精确匹配、通配符匹配和正则表达式匹配的优先级和使用方法,以及 default_server 的作用,可以帮助你更有效地管理和配置 Nginx 服务器,实现灵活的域名和子域名管理。
相关推荐
- 笔记本电脑推荐理由(推荐笔记本子)
-
配置落后散热出现问题是笔记本报废的主要原因因为旧电脑问题很多。一是现在新电脑价格不算贵,没必要用旧的,电脑可不兴新不如旧的说法;二是二手电脑是否大修过,是否有什么瑕疵,是否运行速度有问题,是否被人监控...
- tplink设置向导(tp link路由器的设置向导)
-
tplink路由器首次设置时才会自动弹出向导,如果希望自动弹出,可先还原出厂设置,然后再登录即可自动弹出,还原出厂设置步骤如下: 1、路由器开启电源; 2、按下路由器表面的reset复位按钮,个别...
- 破解苹果激活锁的万能id(破解iphone id激活锁软件)
-
提前打开我的AppleID界面,点击管理您的账户。点击忘记AppleID,填写与AppleID相关的各项基本信息。通过电子邮件内的链接或回答安全问题,或者进行人工破解。1、登陆苹果官网,点击下面...
- 手机上不了wifi是什么原因(手机上不了网连不了wifi)
-
1.手机wifi已连接不可上网问题出现后首先检测一下是否为手机本身突发性的问题,可以进行关机重启一下再连接看是否还会出现这样的情况。或者使用其他手机或设备连接WiFi试试能否上网。2.如果不是手机的问...
- win10有产品id没有密钥(win10 我没有产品密钥)
-
WIN10,在左下角输入WINDOWSPOWERSHELL,然后点击系统查询结果第一项,在弹出的窗口中输入:(Get-WmiObject-query‘select*fromSoftware...
- win10截屏后找不到了(win10截屏后找不到了怎么办)
-
Win10系统截屏后没有更新通知并不是一个常见的问题。可能是由于系统设置或者安装的软件造成的。如果系统设置为静音或者禁用通知,那么截屏后不会有通知。另外,一些截屏软件可能会阻止系统通知,需要手动设置...
- 运行定时关机命令(运行定时关机命令怎么设置)
-
1、打开电脑,按住【Win+R】组合键,弹出运行命令,在编辑框内输入如下命令:shutdown-s-t3600;电脑定时关机运行2、shutdown-s-t3600命令的含义如下:shut...
- 键盘快捷键(键盘快捷键是哪个)
-
电脑键盘快捷键大全:Ctrl+1,2,3... 功能:切换到从左边数起第1,2,3...个标签Ctrl+A 功能:全部选中当前页面内容Ctrl+C 功能:复制当前选中内容Ctrl+D 功能:打开“添加...
- 宏基acer官网商城(宏基官方商城)
-
宏碁本本底部有个序列号标签,不是粉色的那个,粉色的是系统的序列号,白色的是本本的出厂序列号,上宏碁官网查查你的序列号就知道真假了。在盖子的后面就可以查询到序列号,或者是去网上查询宏碁笔记本在官网下...
- 网盘在哪里打开(华为网盘在哪里打开)
-
给你的是一个网盘地址吧,直接把这个地址放到浏览器地址栏就好了,如果有提取码,他会提示你输入提取码的。一般都是在网上找到百度云链接,然后把文件保存在自己的百度网盘文件夹里面的。打开百度网盘app,...
- win7sp1专业版(win7专业版vl)
-
Win7系统SP1是系统发布后第一个SP包x64是64位操作系统。Windows7指的是微软公司的Windows7操作系统ultimate指的是旗舰版(with表示伴随,说明这是提供商所提供...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
慕ke 前端工程师2024「完整」
-
失业程序员复习python笔记——条件与循环
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
