phpStudy配置虚拟主机,说白了就是让本机识别多个自定义域名,不同域名指向各自项目目录。本地开发的时候,所有项目都用127.0.0.1或者localhost访问,来回切换项目很麻烦。配置虚拟主机之后,test.local、admin.test这类自定义域名可以分别访问不同站点,更贴近线上真实环境。
前期准备工作不难。先建好项目文件夹,放在phpStudy的WWW目录下,举个例子D:phpstudy_proWWWtest1、D:phpstudy_proWWWtest2。路径不要带中文、空格,很多人踩这个坑,Apache对中文路径兼容性很差。每个目录放index.php或者index.html,哪怕只写一行测试文字,用来验证站点是否正常运行。

需要修改hosts文件,路径C:WindowsSystem32driversetchosts,右键用管理员身份打开记事本编辑,末尾新增一行127.0.0.1 test1.local,需要多少域名就新增多少行。保存之后命令行执行ipconfig /flushdns,不执行这条命令,关闭浏览器重新打开一般也能生效。这一步作用是让本机系统把test1.local解析到本地回环地址,功能类似线上DNS,仅在当前电脑生效。
接下来配置Web服务器虚拟主机。phpStudy默认使用Apache,打开Apache/conf/httpd.conf,找到#Include conf/extra/httpd-vhosts.conf,删掉行首#注释符号。这一步不能省略,不取消注释,httpd-vhosts.conf不会被加载,里面写再多配置都无效。然后打开conf/extra/httpd-vhosts.conf,文件末尾添加VirtualHost代码块。核心配置三项,ServerName填写域名,DocumentRoot填写项目根目录绝对路径,Directory配置段写入Require all granted开放访问权限。两个站点就写两段配置,域名和目录一一对应。
有个细节容易被忽略。配置虚拟主机之后,直接访问localhost,有可能跳转到第一个虚拟主机站点,或是直接报错。根源是Apache默认优先响应第一个VirtualHost的ServerName,localhost没有匹配任何配置段。解决办法,在httpd-vhosts.conf最开头增加专门适配localhost的配置,DocumentRoot指向WWW根目录,ServerName填写localhost,默认入口就不会被抢占。同时检查httpd.conf,若存在单独一行ServerName localhost,需要注释,避免冲突。
选用Nginx的话,配置思路相近,但语法不一样。打开Nginx/conf/vhosts.conf,没有该文件就新建,添加server配置块。listen 80,server_name填写域名,root填写项目目录,location /配置try_files规则,location ~ .php$内把fastcgi_pass指向127.0.0.1:9000。Nginx配置相比Apache更简洁,但PHP处理部分容易写错,尤其是fastcgi_param SCRIPT_FILENAME,漏写这条,PHP文件会被当成纯文本下载,不会执行。
phpStudy V8及更高版本图形界面简化了操作。左侧菜单点击网站,选择创建站点,填入域名、项目根目录、PHP版本,勾选同步hosts,确认之后自动生成虚拟主机配置,同步写入hosts文件。这套方式不用手动修改配置文件,适合不想碰配置代码的人。但前提是面板虚拟主机开关开启,开关关闭,就算创建站点,Apache只会读取默认DocumentRoot,其他站点无法访问。
排错按顺序检查几项。先ping自定义域名,返回IP不是127.0.0.1,说明hosts配置错误或者DNS缓存没有刷新。再看浏览器报错,403一般是目录缺少默认首页,或是DocumentRoot路径写错;404大概率根目录指向不存在文件夹;页面显示phpStudy默认页面而非项目,多半httpd-vhosts.conf没有加载,回头检查httpd.conf里Include行注释。Apache错误日志在Apache/logs/error.log,里面会记录详细报错,比单纯依靠浏览器页面猜测更快定位问题。
新手容易忽略80端口占用。很多电脑安装迅雷、QQ、IIS,会占用80端口,phpStudy启动Apache看似没有报错,但浏览器访问域名无法连接。使用phpStudy端口检测工具查看,80端口被占用,就把Apache监听端口改成8080,hosts文件依旧填写127.0.0.1,浏览器访问地址后面带上端口号,http://test1.local:8080。修改端口之后,虚拟主机配置里VirtualHost :80同步改成:8080,不修改配置,站点依旧无法访问。