You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 10:06:03