如何在/etc/hosts中配置支持动态子域名的规则
如何用通配符替换/etc/hosts中的多个子域名配置?
嘿,我来给你捋清楚怎么实现这个需求!首先得明确一点:**/etc/hosts本身是不支持通配符(比如*.admin.localhost这种写法)**的,它只能做静态的域名-IP映射。不过我们可以通过两种常用的方式来实现动态匹配所有*.admin.localhost子域名的效果:
方法一:用dnsmasq实现通配符DNS解析
dnsmasq是一款轻量的DNS服务器,非常适合本地做自定义域名解析,完美支持通配符规则:
- 先安装dnsmasq,根据你的系统用对应的命令:
- Ubuntu/Debian系:
sudo apt update && sudo apt install dnsmasq - CentOS/RHEL系:
sudo yum install dnsmasq
- Ubuntu/Debian系:
- 编辑dnsmasq的配置文件(一般是
/etc/dnsmasq.conf),添加下面这一行:
这行配置的意思是:所有以address=/admin.localhost/127.0.0.1admin.localhost为后缀的域名(包括admin.localhost本身和school1.admin.localhost、xxx.admin.localhost这类子域名),都会被解析到127.0.0.1。 - 重启dnsmasq服务让配置生效:
sudo systemctl restart dnsmasq - 最后确保你的系统DNS指向本地,这样dnsmasq才能接管解析:
- 可以临时修改
/etc/resolv.conf,添加nameserver 127.0.0.1(注意有些系统会自动覆盖这个文件,可能需要修改网络配置永久生效) - 或者在桌面系统的网络设置里,把DNS服务器改成
127.0.0.1
- 可以临时修改
做完这些,你就可以删掉/etc/hosts里那5条school1-school5的配置了,只保留127.0.0.1 admin.localhost就行,所有子域名都会自动解析到本地。
方法二:用Nginx的通配符server_name(如果是Web服务场景)
如果你是用Nginx来托管这些子域名的Web服务,那可以直接在Nginx配置里做通配符匹配,不需要额外的DNS工具:
- 打开你的Nginx站点配置文件,修改server块的
server_name字段:server { listen 80; server_name *.admin.localhost; # 下面是你的其他配置,比如root、proxy_pass等 } - 保留/etc/hosts里的
127.0.0.1 admin.localhost,删掉那5条school开头的配置 - 重启Nginx让配置生效:
sudo systemctl restart nginx
这样所有*.admin.localhost的请求都会被这个Nginx server块处理,完美实现你要的动态子域名支持。
补充说明
为什么直接改/etc/hosts不行?因为hosts文件的设计就是静态映射,它不识别*这种通配符符号,所以必须借助DNS服务器或者Web服务器的通配符规则来实现动态匹配的效果。
内容的提问来源于stack exchange,提问作者Shubham Singh Chouhan
相关产品推荐
相关产品推荐

