nginx如何防止非 server_name 配置的域名访问

在 Nginx 中,如果客户端请求的域名未在 server_name 指定的配置中匹配,Nginx 仍然会将请求转发到默认的 server 块。为了防止非 server_name 配置的域名访问,可以使用以下几种方法: 方法 1:使用默认 server 块拦截未匹配的域名 在 Nginx 配置文件中(通常是 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/default.conf),添加一个默认的 server 块,只允许 server_name 明确配置的域名访问,其他所有未匹配的域名都返回 444(直接断开连接)。 1 2 3 4 5 6 7 server { listen 80 default_server; listen [::]:80 default_server; server_name _; return 444; } 解释 listen 80 default_server;:表示该 server 块是默认的服务器,所有未匹配的请求都会进入这里。 server_name _;:这个 _ 是一个通配符,表示未匹配的任何域名都会进入该 server 块。 return 444;:返回 444 状态码,直接断开连接,不给客户端任何响应,提高安全性。 方法 2:使用 if 语句在特定 server 块中拦截 如果不想使用默认 server 块,也可以在你的业务 server 块中检查 Host 头,拒绝非指定域名的访问。 1 2 3 4 5 6 7 8 9 10 11 12 server { listen 80; server_name example.com www.example.com; if ($host !~* ^(example\.com|www\.example\.com)$) { return 403; } location / { proxy_pass http://127.0.0.1:8080; } } 解释 if ($host !~* ^(example\.com|www\.example\.com)$):检查 Host 头,如果不符合 example.com 或 www.example.com,则返回 403 Forbidden。 return 403;:拒绝访问。 ⚠️ 注意:Nginx 官方不推荐 if 语句用于控制访问,但在简单场景下可以使用。 ...

2025年6月18日 · 2 分钟 · 浅忆

nginx配置中location匹配规则详解

一、概述 nginx官方文档给出location语法如下: location [=||*|^~] uri { … } 其中,方括号中的四种标识符是可选项,用来改变请求字符串和uri的匹配方式。uri是待匹配的请求字符串,可以是不包含正则的字符串,这种模式被称为“标准的uri";也可以包含正则,这种模式被称为"正则uri",如下: 1 2 location ~ .*\.(php|php5)?$ { } 二、四种可选的标识符 标识符 描述 = 精确匹配;用于标准uri前,要求请求字符串和uri严格匹配。如果匹配成功,就停止匹配,立即执行该location里面的请求。 ~ 正则匹配;用于正则uri前,表示uri里面包含正则,并且区分大小写。 * 正则匹配;用于正则uri前,表示uri里面包含正则,不区分大小写。 ^ 非正则匹配;用于标准uri前,nginx服务器匹配到前缀最多的uri后就结束,该模式匹配成功后,不会使用正则匹配。 无 普通匹配(最长字符匹配);与location顺序无关,是按照匹配的长短来取匹配结果。若完全匹配,就停止匹配。 备注: 1、如果uri里面包含正则表达式,就必须使用或*标识符; 2、针对和匹配标识符,可以在前面加上!来取反,如下: !~ 表示正则不匹配,区分大小写。 !~ 表示正则不匹配,不区分大小写。 2.1 “=”精准匹配案例 1 2 3 location = /login { # 精确匹配 /login ,匹配成功后,立即结束 } 2.2 “~”区分大小写正则匹配案例 1 2 3 location ~ /images/ { #正则匹配,区分大小写,匹配成功后,立即结束 } 2.3 “~*”不区分大小写正则匹配案例 1 2 3 location ~* /images/ { #正则匹配,不区分大小写,匹配成功后,立即结束 } 2.4 “^~” 不进行正则匹配的标准匹配 ...

2018年12月4日 · 2 分钟 · 浅忆