本地 PHP 项目用域名打不开,九成情况出在三个地方:hosts 文件里没有这条解析记录、Web 服务器没有绑定对应的 ServerName、80 端口被别的程序先占了。按下面顺序逐项排查,通常十分钟内就能让 http://你的域名 在浏览器里正常跑起来。
先搞懂:本地域名访问到底走了哪条链路
浏览器输入一个域名后,并不会直接“连本机”,它要经过这么几步:
- 浏览器先查自己的 DNS 缓存,再查系统 DNS 缓存;
- 系统读 hosts 文件,如果里面写了
0.0.1 dev.mysite.com,就直接返回这个 IP,不再去问公网 DNS; - 浏览器拿着 IP 加端口(http 默认 80)发起连接;
- Web 服务器收到请求后看 HTTP 头里的 Host 字段,再跟自己配置文件里的 ServerName 或 server_name 比对,匹配上才把对应目录交给 PHP 执行。
断在哪一步,现象就不一样:DNS 报错是“找不到服务器”,连接被拒是端口没监听,返回 403/404 是目录或匹配规则写错了。先确定断点,再改配置,比盲目改文件高效得多。
本地 hosts 文件怎么配置域名访问
这是最基础也最容易被跳过的一步,自定义域名在公网上不存在,必须靠 hosts 手动告诉系统“这个域名就是本机”。
各系统 hosts 文件位置
- Windows:
C:\Windows\System32\drivers\etc\hosts - macOS / Linux:
/etc/hosts
Windows 下用管理员权限打开记事本再编辑,否则保存会提示无权限,常见写法:
0.0.1 dev.mysite.com
127.0.0.1 api.mysite.com
::1 dev.mysite.com
最后一行是给 IPv6 用的,很多“hosts 明明写了却还是不通”的案例,就是因为系统优先走了 :1,而服务器只监听了 IPv4。
域名后缀别随便选
业内有个容易踩的坑:.dev 后缀已经被列入浏览器强制 HTTPS 的预加载列表,用它做本地域名,浏览器会直接跳 https,而本地又没有证书,页面就打不开了。.local 在 macOS 上会跟 Bonjour 的 mDNS 解析冲突,相对稳妥的选择是 .test、.localhost 或自己造一个不冲突的二级后缀,mysite.localhost。
改完必须清缓存
hosts 生效不是即时的,浏览器和系统都有缓存:
- Windows:命令行执行
ipconfig /flushdns - macOS:
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder - Chrome 另有一层内部缓存,访问
chrome://net-internals/#dns点 Clear host cache
验证解析是否正确,直接 ping dev.mysite.com,能回 0.0.1 就说明这一步通了。
Apache 虚拟主机配置域名访问 PHP 项目
Apache 默认只会响应一个站点,要让不同域名指向不同项目目录,得启用虚拟主机。
先打开两处开关
在 httpd.conf 里确认这两行没有被注释:
Include conf/extra/httpd-vhosts.conf
LoadModule rewrite_module modules/mod_rewrite.so
第一行是让虚拟主机配置生效,第二行是给 PHP 框架的伪静态路由用,缺了它,ThinkPHP、Laravel 这类项目用域名访问会一路 404。
写 VirtualHost 段落
打开 conf/extra/httpd-vhosts.conf,追加:
<VirtualHost :80>
ServerName dev.mysite.com
DocumentRoot "D:/www/mysite/public"
<Directory "D:/www/mysite/public">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog "logs/mysite-error.log"
</VirtualHost>
几个细节值得注意:Windows 下路径用正斜杠或双反斜杠,单反斜杠会被当成转义符;DocumentRoot 结尾不要带斜杠;Laravel、ThinkPHP 的入口在 public 目录,根目录指错就会出现“能打开目录列表但页面不对”,改完重启 Apache。
Nginx 环境下 php 本地域名访问配置方法
Nginx 的思路一样,只是语法不同,在 conf/nginx.conf 的 http 块里,或者 conf.d/ 下新建一个 mysite.conf:
server {
listen 80;
server_name dev.mysite.com;
root D:/www/mysite/public;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
配完先 nginx -t 检查语法,再 nginx -s reload 重载。fastcgi_pass 的地址要和 PHP-FPM 实际监听的一致,Windows 下常见的是 0.0.1:9000,Linux 下可能是 unix:/run/php/php8.2-fpm.sock,写错了就是 502。
本地无法用域名访问问题排查对照表
| 现象 | 大概率原因 | 处理方式 |
|---|---|---|
| 浏览器提示找不到服务器 | hosts 没写或没生效 | 补记录并刷新 DNS 缓存 |
| 连接被拒绝 | 服务没启动或端口不对 | 启动服务,核对 Listen 端口 |
| 打开的是别的项目 | ServerName 没匹配上,落到默认站点 | 检查域名拼写,设为第一个虚拟主机 |
| 403 Forbidden | 目录权限或缺索引文件 | 补 Require all granted,加 index 文件 |
| 404 但文件明明存在 | 伪静态规则缺失 | 开 rewrite,补 try_files |
| 502 Bad Gateway | PHP-FPM 没启动或地址错 | 启动 FPM,核对 fastcgi_pass |
localhost 能开、换成域名就失败的几类场景
端口被占用
80 端口是重灾区,IIS、Skype、某些杀毒软件的 Web 防护都会悄悄占用,Windows 下执行 netstat -ano | findstr :80 找到 PID,再 tasklist | findstr 进程号 确认是谁,真要改端口,域名访问就得带上端口号,http://dev.mysite.com:8080,hosts 不用动,虚拟主机的 VirtualHost :8080 和 listen 8080 要同步改。
集成环境把配置改回去了
用 phpStudy、WAMP、XAMPP 这类工具时,直接在 httpd-vhosts.conf 里手写的段落,有时会被面板的“站点管理”功能覆盖。更稳的做法是在面板里新增站点,让工具自己写配置,宝塔面板则要注意“网站目录”和“运行目录”是两个设置项,PHP 框架的入口在子目录时,只改前者是不够的。
安全软件拦截 hosts
部分安全软件会把 hosts 文件锁成只读,改完看似保存成功,实际内容没变,用记事本打开确认一遍,或者临时关闭防护再改。
局域网其他设备访问不了
本机通了但手机打不开,通常是没有监听所有网卡,Apache 要确认 Listen 80 而不是 Listen 127.0.0.1:80,并在虚拟主机里用 :80;Nginx 用 listen 80 默认就监听全部网卡,另外对方设备的 hosts 也得写上你的局域网 IP,防火墙要放行 80 端口。
本地 HTTPS 域名访问怎么配
浏览器把 http 标成“不安全”,有些接口(比如摄像头、地理位置)只在 https 下可用,本地调试也会受影响,自签证书要手动信任,比较麻烦,更省事的做法是用 mkcert 生成本地受信任的证书:
mkcert -install
mkcert dev.mysite.com
生成的 dev.mysite.com.pem 和 -key.pem 直接配到虚拟主机的 443 端口即可,行业共识认为,本地开发统一走 https 能提前暴露混合内容、跨域 Cookie 之类的问题,比上线后再补要省心。
php 配置域名访问常见问题解答
改了 hosts 和虚拟主机,浏览器还是跳转到别的网站,是什么原因?
先看域名后缀是不是 .dev,它会触发浏览器强制 HTTPS;再看浏览器是否开了代理或 DoH(DNS over HTTPS),这类功能会绕过系统 hosts 直接走加密 DNS,把它关掉再试,另外确认虚拟主机配置里这个域名排在第一位,否则所有未匹配的请求都会落到第一个站点上。
本地域名访问配置好了,换成手机或同事电脑就访问不了,怎么处理?
本质是域名解析只在你本机生效,让同事在自己电脑的 hosts 里写上你的局域网 IP 加同一个域名,或者在路由器里做一条本地 DNS 记录,同时确认 Web 服务器监听的是 0.0.0,防火墙放行了对应端口,两者缺一不可。
phpstudy 本地域名访问怎么设置最省事?
在面板的“网站”里新建站点,域名填 dev.mysite.com,根目录指向项目目录,保存后面板会自动写 hosts 和虚拟主机配置,再重启一下 Apache 或 Nginx 就行,手动改配置的方式也能用,只是面板下次生成配置时可能覆盖掉,据不少开发者反馈,用面板管理站点更不容易出岔子。
把 hosts 解析、服务器 ServerName 绑定、端口占用这三关依次过一遍,本地 PHP 项目用自定义域名访问基本不会再卡住;后续换项目时,复制一份虚拟主机段落、改改域名和目录,就是全部工作量。