apache默认仅监听ipv4的0.0.0.0:80,不监听ipv6的[::]:80,需在httpd.conf中同时添加listen 0.0.0.0:80和listen [::]:80,并在虚拟主机配置中分别声明和,且hosts文件须同时配置127.0.0.1和::1对应域名。

phpEnv 默认不监听 IPv6,直接配 localhost 或 127.0.0.1 无法通过 ::1 访问,必须手动改 Apache 配置并确认端口绑定生效。
Apache 是否监听 IPv6 地址
phpEnv 底层用的是 Apache,默认安装只监听 IPv4 的 0.0.0.0:80(或你设的端口),::1 请求会被拒绝或超时。验证方式很简单:
- 在终端执行
netstat -an | grep :80(Windows 用netstat -ano | findstr :80),看输出里有没有tcp6行和:::绑定 - 若只有
tcp+0.0.0.0,说明没开 IPv6 - 浏览器访问
http://[::1]返回连接被拒绝,就是这个原因
修改 httpd.conf 启用 IPv6 监听
打开 phpEnv 安装目录下的 Apache/conf/httpd.conf(路径类似 C:\phpenv\Apache\conf\httpd.conf),找到 Listen 行并替换为:
Listen 0.0.0.0:80 Listen [::]:80
注意两点:
- 不能只写
Listen [::]:80,否则 IPv4 会失效;必须两条共存 - 方括号
[::]是必需语法,漏掉会启动失败 - 如果用了非标准端口(如 8080),也要同步加
Listen [::]:8080
虚拟主机配置需显式声明 IPv6 支持
仅改 Listen 不够,站点级配置也得适配。在 httpd-vhosts.conf 或你添加的虚拟主机块中,<virtualhost></virtualhost> 标签必须写成:
<virtualhost>
ServerName www.tp.com
DocumentRoot "C:/phpenv/www/tp"
...
</virtualhost><virtualhost>
ServerName www.tp.com
DocumentRoot "C:/phpenv/www/tp"
...
</virtualhost>
否则 Apache 会把 [::1] 请求路由到默认虚拟主机甚至 404。关键点:
-
*:80负责 IPv4,[::1]:80负责本机 IPv6,两者不可合并 - 两个块里的
DocumentRoot和权限配置(<directory></directory>)必须完全一致,否则行为不一致 - Windows 下若提示“地址已被占用”,大概率是另一个服务占了
[::]:80,可用netsh interface ipv6 show addresses检查
hosts 文件要同时配 IPv4 和 IPv6 条目
phpEnv 的“添加网站”功能通常只写 127.0.0.1 www.tp.com,这会导致 http://www.tp.com 走 IPv4,http://[::1] 才走 IPv6 —— 但你想的是同一个域名双栈解析。解决办法是手动编辑 C:\Windows\System32\drivers\etc\hosts,追加:
127.0.0.1 www.tp.com ::1 www.tp.com
这样浏览器发起 DNS 查询时,会根据系统协议栈优先级自动选 IPv4 或 IPv6 连接。注意:
- 不要用
localhost测试双栈,Windows 下它默认只映射到 IPv4 - 改完 hosts 必须清 DNS 缓存:
ipconfig /flushdns - 某些杀毒软件会拦截 hosts 修改,保存失败时需临时关闭防护
IPv6 双栈真正卡住的地方往往不是配置本身,而是 Apache 启动时静默忽略 [::]:80 错误(尤其 Windows 下权限不足或端口冲突),建议每次改完都用 httpd -t 校验语法,并查看 logs/error.log 里有没有 bind failed 或 Address already in use 提示。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











