@Eddie 的回答对我帮助很大,但我仍然需要做一些额外的研究来为自己在 OSX 上使用 XAMPP 解决同样的问题。为了后代的利益,我想我会在这里添加我的完整解决方案。
首先,我将以下条目添加到 httpd-vhosts.conf(在 XAMPP 中的“etc/extra/”文件夹下):
NameVirtualHost *:80
<VirtualHost *:80>
ServerName localhost
DocumentRoot "/Applications/xampp/xamppfiles/htdocs/"
</VirtualHost>
<VirtualHost *:80>
ServerName client1.my-machine
DocumentRoot "/Applications/xampp/xamppfiles/htdocs/clients/client1/"
</VirtualHost>
<VirtualHost *:80>
ServerName client2.my-machine
DocumentRoot "/Applications/xampp/xamppfiles/htdocs/clients/client2/"
</VirtualHost>
请注意,我专门为 VirtualHost url 使用了通配符而不是“localhost”,并在我指定每个子域名的地方添加了 ServerName 配置。另请注意,我使用了我的机器名称(“my-machine”)而不是“localhost”——这样就可以正确评估来自任何机器(不仅仅是 localhost)的所有请求。我在 OSX 中开发,但通过 Parallels 在各种 VM 中测试浏览器。使用这种方法,我可以从网络上的任何机器或 VM访问http://client1.my-machine 。指定“localhost”后,它只能在我的开发机器上运行。
注意:第一个 VirtualHost 条目用作默认值(如此处所述:http ://httpd.apache.org/docs/2.2/vhosts/name-based.html )并且是必需的,因此请求不会默认为自定义网站。
我还将权限设置添加到 httpd.conf,如@Eddie's answer所示。这并不总是必需的,但我遇到了 2 个需要进行此更改的不同情况:
- 在默认 XAMPP http 根目录之外的目录中创建新站点(基本上任何可通过 http 访问的路径都必须设置明确的权限)
- 为设置为虚拟主机的站点添加 mod_rewrite 规则(在默认的 http 路径下),我收到错误“.htaccess: RewriteEngine not allowed here”。阅读 httpd.conf 中有关该
AllowOverride
选项的注释会使错误的原因显而易见,但我之前忽略了这一点。将此更改为“全部”修复了错误。
请注意,在编辑 httpd.conf 时,您可能需要取消注释以下行(默认情况下已为我注释掉),否则上面所做的 vhosts 更改将不会生效:
# Virtual hosts
Include /Applications/xampp/etc/extra/httpd-vhosts.conf
最后,我还必须将自定义域名添加到我的主机文件中,如上面的评论中所述。在 OSX 上,您可以通过编辑“/private/etc/hosts”(在 Windows 上为“Windows/System32/drivers/etc/hosts”)并添加以下行来执行此操作:
127.0.0.1 my-machine
127.0.0.1 client1.my-machine
127.0.0.1 client2.my-machine
注意:在默认的 OSX Finder UI 中,隐藏文件夹(包括 /private)是不可见的。您可以通过破解内部 Finder 选项(Google 了解详细信息)永久更改此设置,或者更简单地进行偶尔更改,只需使用“Go > Go to folder”菜单选项,您可以直接按名称打开隐藏文件夹。就我个人而言,我使用了一个名为PathFinder的第三方 OSX shell ,我衷心推荐它(值得支付少量许可费)。它包括一个隐藏/显示隐藏文件的菜单选项,以及许多其他有用的功能。
拖累的一件事是,我还必须在指向我的物理开发机器的 Windows VM 主机文件中添加匹配的条目,以便 URL 可以通过 Apache/OSX 解析:
192.168.1.5 client1.my-machine
192.168.1.5 client2.my-machine
我不需要单独的机器名称条目(自动解析),但是如果没有这些主机条目,将子域添加到它就无法正确解析。有时我的 Mac 的 IP 更改(通过 DHCP)确实很糟糕,但这是一个小麻烦。我假设我可以将其设置为不需要这些 IP,但我无法弄清楚并准备继续前进:)(如果有人知道答案,请发表评论)
现在我有多个客户端站点在一个地方运行,并且可以从我的所有开发/测试环境中访问。希望这对其他人有帮助。