试用 Expose 自建内网穿透服务
Expose 是用 PHP 和 Laravel Zero 开发的内网穿透工具。本身提供了免费服务,我这访问起来很卡。好在它是开源的,还支持自建。
服务器端开启服务
首先,在服务器上安装 Expose,前面提到这是 Laravel Zero 开发的现代化的命令行工具,安装只需要下载一个文件:
- 文件同时包含 server 和 client,对应子命令
expose serve
和expose share
# 下载 Expose
$ wget https://github.com/beyondcode/expose/raw/master/builds/expose
$ chmod +x expose
然后,启动服务:
$ ./expose serve
Expose server running on port 8080.
最后,设置反向代理,以 Caddy 为例:
expose.xuchunyang.cn
是给expose share
建立连接的*.expose.xuchunyang.cn
是给内网服务的二级域名,多个服务用不同的子域名来区分
# Caddyfile
expose.xuchunyang.cn:80, *.expose.xuchunyang.cn:80 {
reverse_proxy localhost:8080
}
BT 面板结合 Nginx 也很简单。
客户端分享网站
Laravel Herd 自带的 Expose,所以不用安装,也可以参考上面服务器的方法安装。
假设把本地的 http://demo.test
分享到公网的 http://demo.expose.xuchunyang.cn
,执行:
--server-host=
--server-port=
对应 Expose 服务的域名和端口--subdomain=
--domain
是我们希望使用的域名
$ expose share --subdomain=demo --domain=expose.xuchunyang.cn --server-host=expose.xuchunyang.cn --server-port=80 http://demo.test
Thank you for using expose.
Shared URL: demo.test
Dashboard: http://127.0.0.1:4040
Public HTTP: http://demo.expose.xuchunyang.cn:80
Public HTTPS: https://demo.expose.xuchunyang.cn
如果需要经常输入这个命令,可以把这些选项值写到配置 ~/.expose/config.php
中,之后就简单了:
$ expose share http://demo.test
Thank you for using expose.
Shared URL: demo.test
Dashboard: http://127.0.0.1:4040
Public HTTP: http://demo.expose.xuchunyang.cn:80
Public HTTPS: https://demo.expose.xuchunyang.cn
如果是在 Laravel 项目下,也可直接用:
$ herd share
Thank you for using expose.
Shared URL: demo.test:80
Dashboard: http://127.0.0.1:4040
Public HTTP: http://demo.expose.xuchunyang.cn:80
Public HTTPS: https://demo.expose.xuchunyang.cn
Tip #1:如果 expose share 卡住,没有输出 URL
虽然文档中没提,但是我发现服务器上,也是需要配置文件的,但不用修改:
mkdir ~/.expose/
curl -o ~/.expose/config.php https://github.com/beyondcode/expose/raw/master/config/expose.php
Tip #2: 需要 HTTPS 支持
申请泛域名证书需要通过 DNS Challenge,我理解为需要调用 API 来动态更新 DNS 记录,以 Caddy 为例需要安装各家域名提供商的插件,我使用腾讯云:
# Caddyfile
expose.xuchunyang.cn, *.expose.xuchunyang.cn {
tls {
dns tencentcloud {
secret_id {env.TENCENTCLOUD_SECRET_ID}
secret_key {env.TENCENTCLOUD_SECRET_KEY}
}
}
reverse_proxy localhost:8080
}
# 启动 Caddy,用 -E 传入环境变量
sudo -E ./caddy run
这需要重新装 Caddy,如果你想用的域名不多或者不会变,可以把可能用到的域名列出来,写死在 Caddyfile 中,这样不用通过 DNS Challenge,不用装新的 Caddy。
BT 宝塔 + Nginx 也支持泛域名证书,GUI 操作还简单点。
Tip #3. Vite 资源路径问题
对于使用 Vite 构建前端,内网穿透之后,页面没问题,但是会出现构建的资源地址不对,比如:
GET http://demo.expose.xuchunyang.cn:8080/build/assets/app-Bdu7BThW.css net::ERR_ABORTED 502 (Bad Gateway)
- 多出来 8080,显然来自 Expose 服务的默认端口 8080
这儿的 URL 通常是 @vite
生成的,内部调用 asset()
,因此可以由 ASSET_URL
控制:
# .env
ASSET_URL=/
这样生成的 URL 就变成了 /build/assets/app-Bdu7BThW.css
,之后就能访问了。
除了 asset()
,Laravel 自带的 route()
默认也是绝对路径,可以改为相对路径:
route('test')
// http://demo.expose.xuchunyang.cn:8080/test
route('test', [], false)
// /test