试用 Expose 自建内网穿透服务

Expose 是用 PHP 和 Laravel Zero 开发的内网穿透工具。本身提供了免费服务,我这访问起来很卡。好在它是开源的,还支持自建。

服务器端开启服务

首先,在服务器上安装 Expose,前面提到这是 Laravel Zero 开发的现代化的命令行工具,安装只需要下载一个文件:

  • 文件同时包含 server 和 client,对应子命令 expose serveexpose 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
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!