phpenv本身不支持内网穿透,必须依赖frp等反向代理工具中转;local_port需与phpenv实际监听端口一致,vhost须配置serveralias匹配外网域名,且frpc与frps的token、端口放行、dns解析必须全部正确。

phpEnv 本身不支持内网穿透,必须靠 FRP 这类反向代理工具中转;直接改 phpEnv 的 vhost 或端口无法让外网访问到本地服务。
frpc.ini 配置里 local_port 必须和 phpEnv 实际监听端口一致
phpEnv 默认使用 80 端口(部分版本用 8080 或自定义端口),但不是所有安装都默认启用 HTTP 服务。先确认 phpEnv 当前监听的端口:
- 打开 phpEnv 控制面板 →「网站服务」→ 查看「Apache」或「Nginx」状态,点「配置」看
Listen行(如Listen 80) - 或者直接访问
http://127.0.0.1,再查任务管理器里httpd.exe或nginx.exe的监听端口(用netstat -ano | findstr :80)
常见错误是写成 local_port = 80,但 phpEnv 实际没跑在 80 上(比如被 IIS、Skype 占用),导致 frpc 启动时提示 connect refused。此时要么改 phpEnv 端口,要么同步改 local_port。
域名解析和 custom_domains 要严格匹配
如果用 subdomain = myapp,服务端必须开启 vhost_http_port(如 80),且 DNS 已将 myapp.frp.yo1c.cc 解析到 FRP 服务端 IP;否则浏览器会报 ERR_NAME_NOT_RESOLVED 或连接超时。
更稳妥的做法是用 custom_domains 直接指定完整域名:
[web] type = http local_port = 80 custom_domains = myapp.example.com
这时你得提前把 myapp.example.com 的 A 记录指向 FRP 服务端公网 IP,并确保服务端 frps.toml 中 vhost_http_port = 80 已开放且没被云厂商拦截。
注意:subdomain 和 custom_domains 不能同时存在,否则 frpc 启动失败,报错信息是 conflict between subdomain and custom_domains。
phpEnv 的 vhost 配置必须允许外网 Host 头
即使 FRP 转发成功,phpEnv 的 Apache/Nginx 默认只响应 ServerName 匹配的请求。如果外网用 myapp.example.com 访问,而 vhost 里只写了 ServerName localhost,就会返回 404 或 403。
解决方法是在 phpEnv 对应站点的 vhost 配置里加一行:
ServerAlias myapp.example.com
或者更宽松地允许任意 Host:
UseCanonicalName Off
然后重启 phpEnv 的 Web 服务。不重启,改了也没用 —— 这是多数人卡住的地方。
真正容易被忽略的是:FRP 客户端与服务端的 token 必须完全一致,且服务端 bind_port 在云服务器安全组和本地防火墙都得放行;少一个环节,login to server failed: EOF 就会反复出现。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











