Apache必须配置Listen 0.0.0.0:80(或对应端口)以监听所有IPv4接口,仅改端口或写死IP会导致外部访问失败;Require all granted需在httpd.conf和httpd-vhosts.conf两处块中同时设置;还需放行防火墙中的httpd.exe及对应端口,并用开发机局域网IP(非localhost)从手机访问。

Listen 0.0.0.0:80 必须改,不能只改端口或写死 IP
Apache 默认监听 127.0.0.1:80,外部设备发来的请求根本进不了服务进程。光改端口(比如 Listen 8080)没用,必须显式改成 Listen 0.0.0.0:80(或你实际用的端口,如 Listen 0.0.0.0:8080)。
不要写成 Listen 192.168.1.100:80——IP 一变(换 Wi-Fi、插网线、多网卡),服务立即不可达。0.0.0.0 表示监听所有 IPv4 接口,这是唯一稳定的做法。
Require all granted 要在两处都加,缺一不可
Apache 2.4+(XAMPP 7.x 起全用这个版本)彻底弃用 Order deny,allow,只认 Require 指令。默认的 Require local 会直接返回 403 错误,且它分布在两个地方:
- 主配置
httpd.conf中的<directory></directory>块内(Windows)或<directory></directory>(macOS) - 虚拟主机配置
httpd-vhosts.conf中每个<virtualhost></virtualhost>内部的<directory></directory>块
两处都得把 Require local 替换为 Require all granted。漏掉任意一处,对应路径就会 403。
系统防火墙不放行 httpd.exe 或端口,等于白配
即使 Apache 配置全对,Windows Defender 防火墙或 macOS 防火墙也会静默丢包,导致手机浏览器显示“无法连接”或“连接已重置”。必须手动放行:
XAMPP 8.0.30 是一款免费、开源的跨平台 Web 服务器集成包,专为快速搭建本地 PHP 开发环境而设计。该版本核心组件包括:Apache 2.4.56、MySQL 8.0.33、PHP 8.0.30、phpMyAdmin 5.2.1 等。它支持 Windows、Linux 和 macOS 系统,可让开发者在个人电脑上轻松模拟服务器环境,无需复杂配置即可运行 WordPress、Thin
- Windows:控制面板 → Windows Defender 防火墙 → 允许应用通过防火墙 → 勾选
Apache HTTP Server;若没出现,点「更改设置」→「允许其他应用」→ 手动添加X:\xampp\apache\bin\httpd.exe - macOS:系统设置 → 网络 → 防火墙 → 防火墙选项 → 勾选
Apache HTTP Server;若无,点「+」添加/Applications/XAMPP/xamppfiles/bin/httpd - 别信“关防火墙测试”——这只能验证是否是防火墙问题,但生产环境不能长期关闭
手机访问时必须用局域网 IP,不是 localhost
在手机浏览器里输 http://localhost 或 http://127.0.0.1 是访问手机自己,不是你的电脑。必须先查出开发机的真实局域网 IP:
- Windows:命令行运行
ipconfig,找「无线局域网适配器」或「以太网适配器」下的 IPv4 地址(如192.168.1.100) - macOS:终端运行
ifconfig | grep "inet " | grep -v 127.0.0.1,取第一行非127.0.0.1的地址
然后在手机浏览器输入 http://192.168.1.100(或带端口,如 http://192.168.1.100:8080)。如果用的是自定义域名(如 myproject.local),手机需手动改 hosts(iOS/Android 均不支持系统级 hosts 修改,只能靠本地 DNS 工具或调试代理)。
最容易被忽略的其实是权限指令的双重位置和防火墙的静默拦截——改完配置不重启 Apache、改了主配置却忘了虚拟主机里的 <directory></directory>、开了防火墙但没勾选具体进程,这三个点占了 80% 的失败原因。

















