本地多域名绑定并非修改域名解析,而是通过修改系统的hosts文件配合Web服务器的虚拟主机配置,将多个域名指向本机同一IP,从而实现一套开发环境运行多个网站的效果。
作为开发者,本地调试多个项目时,如果每次都用 localhost/项目名 这种路径访问,不仅别扭,还容易碰到框架路由或者Cookie作用域的问题,更好的方案是模拟线上环境,让每个项目都拥有独立的域名,下面这份操作指南,基于Windows和macOS双平台,同时覆盖Apache与Nginx两种主流服务器,希望能帮你彻底解决本地多域名绑定的配置难题。
本地多域名绑定的核心思路:hosts文件与端口分发
要明白本地绑定多域名的原理,只需要抓住两个核心动作。第一步是欺骗系统,第二步是通知服务器,系统通过hosts文件把域名指到本地,服务器通过虚拟主机配置识别不同域名并分发到不同目录,这两个动作缺一不可,只改hosts不配服务器,浏览器会访问到默认站点;只配服务器不改hosts,域名根被解析到线上,根本到不了你的电脑。
修改hosts文件:将域名指向本机回环地址
hosts文件是一个没有扩展名的纯文本文件,它的作用相当于本地的DNS缓存,当你在浏览器输入域名时,系统会优先查询这个文件,如果命中,就不会再向公网DNS服务器发起请求。
- Windows系统路径:
C:WindowsSystem32driversetchosts - macOS/Linux系统路径:
/etc/hosts
具体操作步骤:
- 以管理员身份打开文本编辑器,Windows下右键点击记事本选择“以管理员身份运行”,macOS下使用
sudo nano /etc/hosts命令。 - 在文件末尾追加映射规则,格式为
IP地址+ 空格 +域名。
0.0.1 project-a.com 127.0.0.1 project-b.cn 127.0.0.1 project-c.local
- 保存文件并刷新DNS缓存,Windows在CMD执行
ipconfig /flushdns,macOS执行sudo dscacheutil -flushcache,这一步必须做,否则系统可能还在使用旧的网络映射。
这里建议不要使用 .test 或者 .dev 这类后缀作为本地域名,因为.dev后缀已被谷歌集团收购,强制强制要求HTTPS,浏览器访问时会出现证书错误,相比之下,.test 或 .local 后缀更为安全,或者直接使用不含易混淆后缀的组合形式。
配置Web服务器:根据域名分发到不同网站目录
宿主机上所有域名都指向了 0.0.1,相当于所有请求都涌到同一台服务器的大门口,服务器软件需要根据请求头中的 Host 字段来决定返回哪个目录下的网页文件,这一步本地多域名绑定怎么设置才算真正落地,完全取决于你用的是Apache还是Nginx。
Apache配置虚拟主机
Apache通过 httpd-vhosts.conf 文件管理多站点配置,首先确保 httpd.conf 文件中取消以下两行注释(去掉行首的 ):
LoadModule vhost_alias_module modules/mod_vhost_alias.so Include conf/extra/httpd-vhosts.conf
然后在 httpd-vhosts.conf 末尾添加配置块。
<VirtualHost :80>
DocumentRoot "D:/www/project-a"
ServerName project-a.com
<Directory "D:/www/project-a">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
<VirtualHost :80>
DocumentRoot "D:/www/project-b"
ServerName project-b.cn
<Directory "D:/www/project-b">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
若使用 phpStudy 或 XAMPP 这类集成环境,配置界面通常位于“站点管理”或“虚拟主机”标签页,可视情况填入域名和根目录路径,保存后重启Apache服务,访问 project-a.com 时就会加载 D:/www/project-a 下的站点,访问 project-b.cn 则加载另一个目录。
Nginx配置server_name匹配
Nginx的配置逻辑是反向代理加正则匹配,比Apache的写法更简洁,在你主配置文件 nginx.conf 的 http 块中,新增两个server节点,以本地域名绑定nginx服务为例,配置如下。
server {
listen 80;
server_name project-a.com;
root /usr/local/www/project-a;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# 若使用PHP,还需包含fastcgi_pass相关配置
}
server {
listen 80;
server_name project-b.cn;
root /usr/local/www/project-b;
index index.php index.html;
# 其他配置同上
}
在Nginx中,一个主机绑定多个域名的关键在于 server_name 指令,如果两个域名共用同一个网站目录,只需要在 server_name 后空格写入多个域名即可:server_name project-a.com project-b.cn,如果目录不同,则必须拆分为独立的 server 块。
端口分流:单IP多站点访问的补充方案
除了基于域名的分发,还有一种通过不同端口访问不同站点的方法,比如使用 http://localhost:8080 访问A项目,http://localhost:9090 访问B项目,此方法不适合生产环境模拟,但在本地调试某些特定框架时比较实用。
- Apache中新增
Listen 8080监听端口,并配置对应<VirtualHost :8080>。 - Nginx中新增
listen 8080的server节点。
这种方案的优点是配置简单,无需区分域名;缺点是浏览器的同源策略会默认不同端口的请求是跨域的,对于前后端分离项目的调试不太友好。
本地多域名绑定后常见的致命错误与排查
配置过程看似简单,但一个主机绑定多个域名时经常会遇到端口占用、权限失效、代理插件干扰这三种状况,这些情况在知乎和CSDN的老帖中讨论较多,新手常因此耽误不少时间。
端口8024已被占用,导致Apache启动失败
场景描述:Apache修改配置重启时提示 Port 80 in use,启动失败,检查发现是本机安装了其他Web环境,或者Windows系统的80端口被IIS服务占用。
解决方案:在CMD运行 netstat -ano | findstr :80 查看占用Microsoft-HTTPAPI的进程PID,然后通过任务管理器结束该进程,若仅需暂时关闭IIS,可使用管理员身份运行 iisreset /stop 命令,对于被SQL Server Reporting Services占用的场景,需要停止数据服务的监听端口,这是一个比较隐蔽的坑。
域名被强制跳转到HTTPS的证书错误
场景描述:配置好Nginx多域名并启动服务后,浏览器访问 http://project-a.com 却自动跳转到 https:// 并报证书错误,这通常是因为浏览器启用了“仅安全内容”的策略,对于某些域名强制升级协议。
解决方案:在地址栏直接输入 http://project-a.com 并回车,不要省略协议头,如果浏览器已经缓存了跳转记录,可以清除站点数据,或暂时关闭浏览器的“始终使用安全连接”选项,与之前提到的 .dev 后缀类似,本地域名尽量选用非强制HSTS的顶层后缀。
本地DNS解析失效:hosts文件被安全软件拦截
场景描述:hosts文件已经加好规则,但 ping 域名时依然解析到公网IP,这大概率是安全软件开启了“hosts文件防篡改”功能,将该文件锁定。
解决方案:检查腾讯电脑管家、火绒安全等软件的信任区设置,将hosts文件路径加入白名单,修改文件时确认文件编码是ANSI或UTF-8无BOM格式,若使用带BOM的UTF-8编码,某些老版本Apache会解析失败。
多域名绑定场景下的伪静态与重定向规则
本地多域名绑定不只是单纯地开设站点,为了让一个主机模拟真实的线上环境,通常还需要处理伪静态和强制域名跳转。
伪静态规则:让本地环境匹配线上地址格式
不少PHP框架(如ThinkPHP、Laravel)依赖URL重写去掉入口文件index.php,而Nginx和Apache对于本地多域名伪静态的处理手法是有差异的。
- Apache环境:由于使用了
AllowOverride All,多数情况下只需在站点根目录放置.htaccess文件,该文件内容沿用线上的重写规则即可,无需额外修改。 - Nginx环境:不支持
.htaccess,必须在server块内配置location /下的try_files伪静态参数,更换项目目录时,需要同步修改这段配置,如果项目较多,建议为每个站点单独创建一个.conf文件并include引入。
单域名强制跳转:站长工具的收录偏好
当你的本地环境同时模拟电脑站和手机站时,需要将不带 www 的域名统一重定向到主域名,这属于较高级的本地方案,操作时注意不要在本地测试时把跳转代码遗漏在正式项目里,否则会导致线上站点被搜索引擎误判。
以Nginx为例,在对应server块中添加重定向规则。
if ($host != 'project-a.com') {
return 301 http://project-a.com$request_uri;
}
Apache环境则可通过 mod_rewrite 模块实现。
本地多域名绑定常见问题解答
Q1:本地多域名绑定和修改DNS解析有什么区别?
修改DNS解析是公网操作,将域名的A记录指向服务器公网IP,任何网络用户都能访问,且DNS生效有延迟,本地多域名绑定是纯本机行为,通过hosts文件和Web服务器配置文件模拟域名访问逻辑,仅在你自己的电脑上生效,如果你只想自己测试网站,用hosts方式是成本最低的,且不需要购买云服务器,如果你希望局域网内的同事也能访问,仅改hosts是不够的,需要将hosts映射的IP地址从 0.0.1 改成你电脑在局域网中的IP,并且需要确保系统防火墙放行对应端口,这属于另一个话题了。
Q2:一个主机绑定多个域名会不会影响网站打开速度?
不会产生可感知的影响,服务器在收到HTTP请求后通过域名匹配虚拟主机是一个极快的内存级操作,性能开销几乎可以忽略不计,真正影响速度的是Web服务器本身的并发能力、PHP解析进程数量以及项目中的数据库查询,在本地开发环境下,多个域名共享一套Apache或Nginx进程,资源占用主要取决于同时运行的PHP-CGI进程个数,与绑定的域名数量关系不大。
Q3:本地用http协议访问多个域名时,浏览器一直提示不安全怎么办?
这个问题在Chrome和Edge浏览器上很常见,根本原因是浏览器对所有非HTTPS站点的信任度降低,由于本地环境没有部署SSL证书,浏览器会显示“不安全”的标识,你可以采用两种方式解决:对于Chrome浏览器,访问 chrome://flags/#unsafely-treat-insecure-origin-as-secure 这个实验性选项,在输入框中添加你的本地域名并启用该功能;或者使用 mkcert 工具为本地域名签署一份受信任的证书,并在Nginx或Apache配置中启用443端口,本地开发的稳妥顺序是先在hosts与服务器端口层面完成多站点的初步联通,待业务验证无误后再考虑证书与安全浏览器的兼容问题。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/624072.html





