Windows 本地搭建多个 PHP 网站,Apache 虚拟主机应该如何设置
在Windows电脑上同时运行多个PHP网站,并不需要为每个网站安装一套独立的Apache。Apache本身就支持虚拟主机,可以让多个网站共用同一个Web服务器,通过不同的域名将请求分配到不同的网站目录。对于本地开发环境来说,这种方式比为每个项目设置不同端口更加方便,也更接近真实服务器上的网站部署方式。
假设电脑上准备运行两个PHP网站,可以分别建立在 `C:\Apache24\htdocs\site1` 和 `C:\Apache24\htdocs\site2`。两个网站使用同一个Apache实例,但各自拥有独立的DocumentRoot。真正决定请求进入哪个网站的,并不是目录名称,而是浏览器访问时使用的域名。
首先需要确认Apache已经启用了虚拟主机配置。在 `httpd.conf` 中找到类似下面的配置:
`Include conf/extra/httpd-vhosts.conf`
如果前面存在 `#`,需要取消注释。然后打开 `conf\extra\httpd-vhosts.conf`,为每个网站建立一个VirtualHost。
例如,第一个网站可以使用 `site1.local`:
``
` ServerName site1.local`
` DocumentRoot "C:/Apache24/htdocs/site1"`
` `
` AllowOverride All`
` Require all granted`
` `
` `
第二个网站则可以配置为:
``
` ServerName site2.local`
` DocumentRoot "C:/Apache24/htdocs/site2"`
` `
` AllowOverride All`
` Require all granted`
` `
` `
这里最重要的一点是,两个网站完全可以同时使用80端口。Apache根据浏览器发送的Host信息判断用户访问的是 `site1.local` 还是 `site2.local`,然后将请求交给对应的虚拟主机。因此,正常的本地开发环境通常不需要给每个网站分配不同端口。
接下来还需要让Windows知道这些本地域名应该指向本机。Windows的hosts文件通常位于:
`C:\Windows\System32\drivers\etc\hosts`
使用管理员权限打开后,可以加入:
`127.0.0.1 site1.local`
`127.0.0.1 site2.local`
保存以后,浏览器访问 `http://site1.local` 就会先通过hosts文件解析到本机,再由Apache根据ServerName选择site1目录。同理,访问 `http://site2.local` 时则进入site2目录。
如果只是使用 `localhost` 加不同路径,例如 `http://localhost/site1` 和 `http://localhost/site2`,其实并不需要虚拟主机。只有当希望不同网站拥有独立域名、独立DocumentRoot,或者需要模拟真实生产环境时,虚拟主机才更加有价值。
PHP的配置则需要根据安装方式决定。如果使用较新的PHP for Windows,通常推荐通过FastCGI运行PHP,而不是继续使用已经过时的PHP 7 Apache模块配置。Apache可以通过mod_proxy_fcgi等机制把PHP请求交给PHP-CGI或PHP-FPM兼容的FastCGI服务处理。不同PHP发行版和开发环境的具体配置方式可能有所不同,因此不能简单地把 `LoadModule php7_module "modules/php7.so"` 复制到新的PHP环境中。
如果使用XAMPP、WampServer等集成开发环境,PHP和Apache通常已经完成了基础集成,此时重点是配置虚拟主机,而不是重复安装PHP模块。对于自己安装Apache和PHP的用户,则应该先确认PHP命令行版本、Apache版本以及PHP运行方式,再确定对应的Apache配置。
每个网站还应该拥有自己的Directory配置。例如:
``
` AllowOverride All`
` Require all granted`
` `
其中 `Require all granted` 是允许Apache访问该目录的重要配置。Windows上的文件权限与Linux不同,通常不应该照搬Linux服务器上的 `chmod 755` 或 `chmod 644` 思路。出现403 Forbidden时,应检查Apache进程是否能够访问目标目录,同时检查虚拟主机配置是否正确。
网站默认首页则可以通过 `DirectoryIndex` 设置。例如:
`DirectoryIndex index.php index.html`
这样,当用户访问网站根目录时,Apache会优先寻找index.php,如果不存在,再尝试index.html。这个配置可以放在Apache全局配置中,也可以根据AllowOverride设置放在网站自己的.htaccess文件中。
需要注意的是,两个网站拥有同名的 `index.php` 完全没有问题。site1的 `index.php` 和site2的 `index.php` 位于不同的DocumentRoot,Apache不会因为文件名相同而“优先加载第一个”。决定文件位置的是虚拟主机的DocumentRoot,而不是服务器中哪个文件先出现。
如果网站使用Rewrite规则,例如PHP框架、WordPress或者自定义路由系统,则需要允许 `.htaccess` 工作。常见配置是:
`AllowOverride All`
同时应确认Apache已经加载mod_rewrite模块。否则,网站虽然能够打开首页,但访问内部URL时可能出现404错误。
配置完成以后,不要直接猜测问题出在哪里,而应该先进行语法检查。Windows环境下可以在Apache的bin目录执行:
`httpd.exe -t`
如果显示 `Syntax OK`,说明Apache配置文件的基本语法没有问题。随后重新启动Apache。如果启动失败,应立即检查Apache错误日志,而不是不断修改配置文件。
还可以使用:
`httpd.exe -S`
查看Apache当前识别到的虚拟主机配置。这个命令对于排查多个VirtualHost非常有用,可以看到80端口上配置了哪些域名,以及Apache最终将请求映射到哪个虚拟主机。
如果浏览器访问 `site1.local` 却进入了site2,通常应该优先检查ServerName、hosts文件以及VirtualHost配置顺序,而不是修改PHP代码。如果两个VirtualHost使用相同的ServerName,Apache就无法按照预期区分网站。
本地HTTPS测试则属于另一层配置。如果需要测试登录Cookie、安全上下文、Service Worker或者正式环境中的HTTPS行为,可以进一步为每个本地域名配置SSL虚拟主机,例如监听443端口,并使用mkcert生成本地受信任证书。此时需要同时配置证书、私钥以及对应的HTTPS VirtualHost。
对于Windows本地开发来说,多个PHP网站最合理的结构通常是“一个Apache、多个DocumentRoot、多个本地域名”。例如site1.local对应site1目录,site2.local对应site2目录。所有网站可以共享80端口,通过Host请求头完成分流。只有在需要模拟不同服务、不同网络端口或者特殊测试环境时,才有必要让网站分别监听8080、8081等端口。
掌握VirtualHost、DocumentRoot、ServerName和hosts文件之间的关系之后,本地运行多个PHP项目就不再需要不断修改Apache主目录。每个网站拥有独立目录和域名,同时共享Apache、PHP运行环境,这种结构既便于开发,也更加接近实际服务器上的多站点部署方式。
喜欢这篇报道?
使用下面的功能,方便以后继续阅读和分享 MNewsTV
关于文章收藏
收藏不需要注册帐号,收藏信息仅保存在当前浏览器中。
删除收藏请进入「我的收藏」进行管理。
分享 Facebook | X | WhatsApp | LinkedIn
捐助(Paypal): https://www.paypal.me/observeccp 订阅中国观察电报 Telegram : https://t.me/s/ObserveCCP