Expo搭配Android模拟器如何访问本地Apache多虚拟域名站点
解决Expo Android模拟器访问本地Apache虚拟站点404问题
问题根因
你遇到404的核心原因是:Android模拟器访问10.0.2.2时,请求默认携带的Host头是10.0.2.2,你的Apache虚拟主机仅匹配site1.local/site2.local/api.local三个域名,请求落到默认的localhost虚拟主机上,所以只有该主机配置的oauth/token路径可访问,其余路径返回404。
方案1:修改Android模拟器hosts文件(最稳定,推荐)
直接在模拟器系统层绑定三个虚拟域名指向本地IP,之后可以直接用域名发起请求:
- 确保模拟器已启动,执行adb命令获取系统权限:
adb root adb remount - 导出模拟器的hosts文件到本地:
adb pull /system/etc/hosts ./local_hosts - 编辑本地的
local_hosts文件,末尾追加三行配置:10.0.2.2 site1.local 10.0.2.2 site2.local 10.0.2.2 api.local - 将修改后的hosts文件推送回模拟器:
adb push ./local_hosts /system/etc/hosts
配置完成后,在Expo代码中直接请求http://site1.local/http://api.local即可正常匹配虚拟站点。
方案2:请求时自定义Host头(无需修改系统配置,适合临时调试)
发请求时主动指定Host头为目标站点域名,Apache会根据Host头匹配对应虚拟主机:
举个axios请求的示例:
axios.get('http://10.0.2.2/your/api/path', { headers: { 'Host': 'api.local' // 替换为你要访问的站点域名 } })
注意:该方案仅对单次请求生效,每次访问不同站点需要修改对应的Host头
方案3:给虚拟站点绑定不同端口(无需修改hosts和请求头)
修改Apache配置,给三个虚拟站点分别设置独立的监听端口:
- 编辑Apache的监听配置,新增需要的端口监听:
Listen 8001 # api.local端口 Listen 8002 # site1.local端口 Listen 8003 # site2.local端口 - 修改三个虚拟主机的配置,分别绑定对应端口:
比如api.local的虚拟主机配置改为:<VirtualHost *:8001> ServerName api.local # 其余原有配置保持不变 </VirtualHost>
配置完成重启Apache后,在Expo中直接请求http://10.0.2.2:8001即可访问api站点的接口。
注意事项
- Android 9及以上系统默认禁止明文HTTP请求,需要在Expo项目的
app.json中添加配置开启明文流量权限:{ "expo": { "android": { "usesCleartextTraffic": true } } } - 修改配置后需要重启Expo开发服务和模拟器,避免缓存影响验证。
内容的提问来源于stack exchange,提问作者Adrienp
相关产品推荐
相关产品推荐

