解决 Astro 开发服务器无法通过 Tailscale/外网访问的问题

问题

Astro 开发服务器默认绑定 localhost(127.0.0.1),只接受本机连接。通过 Tailscale IP 或局域网 IP 访问时连接超时。

启动 pnpm dev 后终端只显示 Local http://localhost:4321/,没有 Network 行。用 lsof 确认:

$ lsof -i :4321
node  12345  user  23u  IPv4  ...  TCP 127.0.0.1:4321 (LISTEN)
#                                      ^^^^^^^^^^^ 只绑定了 127.0.0.1

原因

Astro(以及 Vite、Next.js 等框架)出于安全考虑,开发服务器默认绑定 localhost,只有本机进程能连接。其他网络接口(包括 Tailscale 虚拟网卡)被排除在外。


解决方法

方法一:命令行加 --host(临时)

pnpm dev -- --host

启动后终端会显示 Network 行,包含局域网 IP 和 Tailscale IP。缺点是每次都需要手动加参数。

方法二:修改配置文件(永久)

astro.config.mjs 中添加:

export default defineConfig({
  site: 'https://your-site.com',
  server: { host: true },  // 监听所有网络接口
  // ...
});

host: true 等价于 host: '0.0.0.0'。修改后重启 dev server 即可。


验证

重启后终端输出包含 Network 行即表示成功:

┃ Local    http://localhost:4321/
 Network  http://192.168.68.132:4321/
           http://100.65.227.42:4321/

lsof 确认绑定地址变为 *:4321(所有接口):

$ lsof -i :4321
node  12345  user  23u  IPv4  ...  TCP *:4321 (LISTEN)

其他框架

框架配置方式
Astroserver: { host: true }
Viteserver: { host: '0.0.0.0' }
Next.jsnext dev -H 0.0.0.0
Nuxtnuxt dev --host

本质都是将绑定地址从 localhost 改为 0.0.0.0


注意事项

开放 0.0.0.0 监听后,任何能到达本机 IP 的设备都能访问开发服务器。建议仅在 Tailscale 等受控网络环境下使用,避免在公共 Wi-Fi 暴露端口。生产环境不要使用此配置,应通过 Nginx/Caddy 反向代理。


参考链接

100%

Lv.1 亲密度 0