从 android 应用程序连接到本地后端

connecting to local backend from android app

我有我的 Laravel 后端,我正在尝试从 android 应用程序连接到它。我的主机文件有

   127.0.0.1    my.backend.test

我后端的 httpd 配置文件是

<VirtualHost *:80>
ServerName      my.backend.test
DocumentRoot    /var/www/mybackend.co.uk/code/public/
DirectoryIndex  index.php
RewriteEngine   On
ErrorLog        /var/www/mybackend.co.uk/code/storage/logs/apache_error.txt

Header set Access-Control-Allow-Origin "http://localhost:4200"

<Directory /var/www/mybackend.co.uk/code/public/>
    AllowOverride All
</Directory>

我可以从 google ARC 正常访问 http://my.backend.test/api/some-route,但不能从我的 phone 访问。我似乎必须使用我的本地 IP 地址,但我不明白如何设置它。

我尝试添加

<VirtualHost 192.168.my.ip:8080>
ServerName      my.mobilebackend.test
DocumentRoot    /var/www/mybackend.co.uk/code/public/
DirectoryIndex  index.php
RewriteEngine   On
ErrorLog        
/var/www/mybackend.co.uk/code/storage/logs/apache_error.txt

<Directory /var/www/mybackend.co.uk/code/public/>
     AllowOverride All
</Directory>

到 httpd conf 和

192.168.my.ip my.mobilebackend.test

主机

试试这个方法

ip:port

示例

10.0.2.2:80

注意:防火墙可能会导致此问题。 Windows 默认启用 Microsoft Windows 防火墙。您可能需要禁用它


IP 地址

如果您使用的是模拟器:

10.0.2.2

如果您使用的是真实设备:

  1. 将它们连接到同一个网络。在 phone.
  2. 中使用 WiFi 连接或使用 USB 网络共享选项
  3. 在 cmd 中输入 ipconfig 查找您计算机的 IP 地址(如果您使用的是 Windows)

端口

默认端口为 80。如果您已更改它,请使用新的。

好的,我们先把你遇到的问题说清楚,这样我的解决方案就更清楚了。

你的问题是你在你的计算机上本地托管了一个后端,虽然你可以在你的计算机上毫无问题地访问它,但是当你尝试从不同的设备连接到它时你无法访问它。

这个问题是因为您的网站是在您的本地计算机上托管的,外界无法访问,因此您的 phone 可能是在移动网络上,无法访问您的后端,因为您的后端在你自己的私有网络上,你的 phone 不能从它自己的网络访问这个私有网络,这是因为你的 router/isp 通常会阻止对端口 80 的传入请求,所以即使你会知道你的计算机 public IP 地址你仍然会被阻止。

既然我们讨论了这个问题,那么让我们来看看解决方案需要什么。 一个解决方案是您的 phone 和您的计算机都在同一网络上,或者您将计算机暴露在 public 互联网上。

让我们通过一些方法来实现这一目标。

  1. 实现此目的的第一个并且可以说是最简单的方法是将您的计算机和 phone 置于同一网络中。这可以通过将您的 phone 连接到为您的计算机提供互联网访问的同一路由器来实现。一旦你连接到同一个网络,你所要做的就是不要使用这个 url http://my.backend.test/api/some-route,而是将 my.backend.test 替换为你计算机的本地 ip 地址,所以如果你的计算机本地 ip是 192.168.0.2 然后它变成这个 http://192.168.0.1/api/some-route 现在你将能够从你的 phone.
  2. 访问你的后端

注意:您可能想知道我如何计算出我的计算机本地 ip 地址?在 windows 上,可以通过进入网络设置找到它 > 右键单击​​您的网络连接 > 从上下文菜单中单击属性,然后查找显示 ipv4 地址的字段,即您的本地 ip。在 mac 上,您可以通过转到系统偏好设置 > 网络 > 单击旁边有绿点的连接 > 然后在状态标签下方,您将看到您连接的当前本地 IP 地址。

如果您不介意将 phone 连接到与您的计算机相同的网络,那么解决方案 #1 非常好,但可以说它很痛苦,或者由于各种原因不切实际,例如缺少wifi 等或者只是您希望 phone 能够从 任何地方访问计算机,无论它在什么网络上 如果是这种情况,解决方案 2是给你的。

  1. 我们将通过使用反向隧道软件使您的计算机本地主机能够访问整个互联网,在我们的例子中,最受欢迎的选择之一是 Ngrok,可用 here。 Ngrok 所做的是创建一个到您本地主机的隧道,并为其分配一个 public 可访问的域,例如 yourapp.ngrok.io,您可以使用它代替 my.backend.test 从任何地方访问您的应用程序。因此,一旦启用 Ngrok,您只需将 http://my.backend.test/api/some-route 替换为 http://yourNgrokAppDomainName.ngrok.io/api/some-route,然后无论您使用哪个网络,您都可以从任何地方从 phone 访问您的后端。

总而言之,您可以通过两种方式从 phone 访问您计算机上的后端。希望对你有帮助。

如果我理解正确:您可以从同一网络上的不同机器访问您的服务器(所以这不是防火墙问题)但前提是您使用名称(添加到客户端的主机文件中)而不是 IP地址。

你的配置是第一个虚拟主机吗? apache 搜索与查询中提供的名称匹配的 ServerName(例如 URL),然后回退到第一个,在您的情况下是 ubuntu 主页。

作为测试,如果你使用

会发生什么
ServerName      192.168.0.1 (i.e. the IP used in the URL)

我认为如果您通过 IP 地址访问服务器会有效,但不再通过名称访问服务器