我正在开发一个简单的 React 应用,想在手机上测试它。每次我这样做时,npm start
它都会运行一个react-scripts
模块,启动浏览器来显示您正在开发的项目。太棒了!运行起来非常好。
但因为我试图在手机上测试它,在您的网络上url 不起作用,我不得不找到一些解决方案,并在 WSL github 上使用以下命令获取了一个脚本。
$remoteport = bash.exe -c "ifconfig eth0 | grep 'inet '"
$found = $remoteport -match '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}';
if( $found ){
$remoteport = $matches[0];
} else{
echo "The Script Exited, the ip address of WSL 2 cannot be found";
exit;
}
#[Ports]
#All the ports you want to forward separated by coma
$ports=@(80,443,10000,3000,5000);
#[Static ip]
#You can change the addr to your ip config to listen to a specific address
$addr='0.0.0.0';
$ports_a = $ports -join ",";
#Remove Firewall Exception Rules
iex "Remove-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' ";
#adding Exception Rules for inbound and outbound Rules
iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Outbound -LocalPort $ports_a -Action Allow -Protocol TCP";
iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort $ports_a -Action Allow -Protocol TCP";
for( $i = 0; $i -lt $ports.length; $i++ ){
$port = $ports[$i];
iex "netsh interface portproxy delete v4tov4 listenport=$port listenaddress=$addr";
iex "netsh interface portproxy add v4tov4 listenport=$port listenaddress=$addr connectport=$port connectaddress=$remoteport";
}
读完之后我觉得很好,我知道正确的 URL 是从我的路由器分配给某个东西的实际 IP 192.168.1.36
,而不是,172.19.118.whatever
并且脚本在 Windows 防火墙上创建规则以允许访问 WSL2 实例。
问题
现在我遇到了一个问题...我无法localhost
在电脑上使用。
我不知道脚本做了什么,我只是害怕说0.0.0.0
你们中有谁知道该怎么做才能恢复或修复我的笔记本电脑上的本地主机别名?
更新
由于 WSL localhost 解析与文件无关,因此hosts
我将删除该部分帖子。我很困惑,完全不明白这个问题。
答案1
将其更改
127.0.0.1 kubernetes.docker.internal
为
127.0.0.1 kubernetes.docker.internal localhost
答案2
在 hosts 文件中,您将名称/域绑定到 ip。
每台机器上127.*
都有。localhost loopback
使用ping 127.1
或127.0.0.1
您可以检查您的网络设备是否正常工作(如果ping
没有禁用)。
您可以将更多域名绑定到127.* loopback
。
您可以将多个域/主机设置为一个 IP:
示例主机 1:
127.0.0.1 localhost name1 name2.domain name.name3.domain kubernetes.docker.internal
192.168.1.36 host.docker.internal gateway.docker.internal myreactapp
示例主机 2:
127.0.0.1 localhost
127.0.0.1 name1
127.0.0.1 name2.domain
127.0.0.1 kubernetes.docker.internal
192.168.1.36 host.docker.internal
192.168.1.36 gateway.docker.internal
192.168.1.36 myreactapp
示例主机 3:
如果你在 apache 或其他 webservice 中使用虚拟主机作为示例,你可以将它们绑定different 127.* loopback addresses
到
127.0.0.1 localhost
127.0.0.2 name1
127.0.1.1 kubernetes.docker.internal
192.168.1.36 host.docker.internal
192.168.1.36 gateway.docker.internal
192.168.1.36 myreactapp
正常情况下,您不需要触碰您的主机文件。
您创建/运行您的 react-script,并在本地机器上找到具有给定端口的应用程序,例如3000
http://localhost:3000
在您的情况下,该 iphttp://172.19.118.105:3000
是 docker 或您的容器/服务环境提供的虚拟 ip(我认为您使用 docker 或者?)因此您http://172.19.118.105:3000
只能从本地机器获取此地址。
3 解决方案您现在可以做什么:
将手机的 IP 更改为类似的东西
172.19.118.106
,如果您没有直接连接并gateway
通过调用应用程序,也许您需要将此 IP 添加到您的 Hosts 文件中,也许此示例在您的机器上不起作用router
http://172.19.118.105:3000
使用您的
WSL github
脚本并hosts
根据您的需要进行修改并像调用您的应用程序一样http://192.168.1.36:3000
在 windows
ipconfig
、linux上运行ifconfig
或ip a
查找您的本地 ip192.168.1.36
,如果手机在同一个网络上,请尝试检查您的规则,http://192.168.1.36:3000
如果遇到问题firewall
您可以http
从手机等其他设备访问您的应用仅使用 IP 地址如果你想通过名称/域名呼叫你需要在每个设备上的所有 hosts 文件中添加条目或者你需要运行dns server
答案3
感谢上帝,微软的某个人采取措施备份了这些设置!
我用这个命令修复了它netsh interface portproxy reset
脚本的最后几行触及隐藏的设置,重定向一个不断变化的代理,因为 WSL 有一个动态 IP。
因此,hosts
Windows 中的文件毫无用处,一切都与 WSL 和 Windows 的端口映射以及深度 HyperV 布线有关。这些东西对我来说太复杂了,所以我就不说了。我总是可以在虚拟机上部署以进行测试。遗憾的是,WSL2 不支持桥接网络适配器。它使用 NAT 作为默认和唯一选项。
希望这对其他人有帮助
答案4
这不是一个答案而是一个解决方法。
但是只要选择 0.0.0.0,我就会在唯一的端口上进行 SSH,并将我需要的任何内容转发到我的手机。
IE,我使用 XSDL 转发 X11。它默认使用 6000/+1,但我可以随意更改它。相同的过程适用于 tvnc 等...