Apache VirtualHost和localhost

81
我正在使用Mac OS X上的XAMPP进行工作。
我正在尝试为客户正确运行一个Symfony网站,但我真的不了解Symfony(还)。我只想安装和启动它。
我已经以这种方式更改了我的/etc/hosts文件:
127.0.0.1 www.mysite.local

而且这样的httpd.conf文件:
<VirtualHost *:80>
  ServerName www.mysite.local
  DocumentRoot /Applications/MAMP/htdocs/mysite/web
  DirectoryIndex index.php
  <Directory /Applications/MAMP/htdocs/mysite/web>
    AllowOverride All
    Allow from All
  </Directory>
  Alias /sf /Applications/MAMP/htdocs/mysite/lib/vendor/symfony/data/web/sf
  <Directory "/Applications/MAMP/htdocs/mysite/lib/vendor/symfony/data/web/sf">
    AllowOverride All
    Allow from All
  </Directory>
</VirtualHost>

现在,网站已经可以正常运行了(耶!),但是我无法访问我的其他本地站点,因为localhost被渲染为www.mysite.local
我错在哪里了?
13个回答

129

这对我起作用了!

要运行类似于 http://localhost/projectName 的项目:

<VirtualHost localhost:80>
   ServerAdmin localhost
    DocumentRoot path/to/htdocs/
    ServerName localhost
</VirtualHost>

要在本地运行像 http://somewebsite.com 这样的项目:

<VirtualHost somewebsite.com:80>
     ServerAdmin webmaster@example.com
     DocumentRoot /path/to/htdocs/somewebsiteFolder
     ServerName www.somewebsite.com
     ServerAlias somewebsite.com
</VirtualHost>

对于其他网站也是一样:

<VirtualHost anothersite.local:80>
     ServerAdmin webmaster@example.com
     DocumentRoot /path/to/htdocs/anotherSiteFolder
     ServerName www.anothersite.local
     ServerAlias anothersite.com
</VirtualHost>

10
我觉得这应该是被接受的答案。不需要端口交换,就像原帖作者所想象的那样。 - Ricky Boyce
8
谢谢,非常好!这对我很有帮助。另外,我想说,如果有人想要运行类似于“projectname.com”的项目,他需要将“projectname.com”添加到“hosts”文件中(在Ubuntu上为“/etc/hosts”)。 - Dmitry Wojciechowski
2
但是这些配置不能同时使用? - albanx
1
而/etc/hosts看起来如何? 当文档腐烂在/var/www之外时,这是否有效? - axd
3
为什么要在 <VirtualHost> 标签中放置服务器名称?为什么不保持 *:80 - Chuck Le Butt
显示剩余4条评论

32

localhost会始终重定向到127.0.0.1。您可以通过将其他VirtualHost命名为其他本地环回地址(例如127.0.0.2)来欺骗它。确保您还更改了相应的hosts文件以实现此目的。

例如,我的httpd-vhosts.conf文件如下:

<VirtualHost 127.0.0.2:80>
    DocumentRoot "D:/6. App Data/XAMPP Shared/htdocs/intranet"
    ServerName intranet.dev
    ServerAlias www.intranet.dev
    ErrorLog "logs/intranet.dev-error.log"
    CustomLog "logs/intranet.dec-access.log" combined

    <Directory "D:/6. App Data/XAMPP Shared/htdocs/intranet">
        Options Indexes FollowSymLinks ExecCGI Includes
        Order allow,deny
        Allow from all
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
注意,在 <VirtualHost> 部分我输入了 127.0.0.2:80。这意味着这个 VirtualHost 块只会影响到 IP 地址为 127.0.0.2 端口为 80 的请求,而这个端口是 HTTP 的默认端口。
为了正确路由名字为 intranet.dev 的请求,我的 hosts 条目如下:
127.0.0.2 intranet.dev

这样做可以防止您为localhost创建另一个不必要的VirtualHost块。


使用其他本地回环地址是一个非常巧妙的技巧。赞! - Terix
3
专业提示:不要忘记修改httpd.conf中的Listen参数以匹配您配置的环回地址。 - Noir
1
是的!对我来说,使用127.0.0.2(或.3或.4等)在本地机器上测试站点(Win 10,Apache,PHP7.2),同时使用.htaccess Rewrite规则,这个方法很管用。谢谢! - Rob Banmeadows

25

如果您看到这个页面,那么这是正常的。因为它是第一个虚拟主机条目,它会显示本地主机。

比如说,如果你不想让这个页面显示出来,你只想要展示“Apache, it works”页面,那么你可以在mysite.local之前创建一个vhost条目作为本地主机,并将其指向“it works”页面。

但这是正常的。我以前也遇到过这个问题,所以不用担心!


2
好的,我已经在第一个指令后面添加了一个本地主机的虚拟主机,现在它可以工作了。谢谢 :) - Angelica Rosa
1
没问题 :) 这就是我在这里的原因! - The Computer Hugger
1
@AngelicaRosa 你能否逐步指导你是如何解决问题的。我无法为localhost创建虚拟主机。 - Siraj Alam
1
@Siraj,只需查看得到74个赞的答案,那里有你需要使用的虚拟主机代码。 - Angelica Rosa

15

你可能想要使用这个:

<VirtualHost *:80>
    DocumentRoot "somepath\Apache2.2\htdocs"
    ServerName localhost
</VirtualHost>
<VirtualHost *:80>

把它作为你的第一个虚拟主机(放在其他虚拟主机之前)。


这对我在Mavericks上解决了问题。 - alchemication
在我的Ubuntu 14.04上运行良好! - Konsole
干得好,你真是个了不起的人! - Tania Rascia
对我也起作用了。尽管你的答案只是其他上面的答案的重复,但我确实按照你所做的做了,它起了作用。 非常感谢。 - Siraj Alam
Mavericks = [Mac OS X v10.9](https://en.wikipedia.org/wiki/OS_X_Mavericks) - Peter Mortensen

10

以下是John Smith的答案,以及官方文档中的补充说明。为了理解其中的原因。

主机离线

如果您在现有的Web服务器上添加虚拟主机,则还必须为现有主机创建一个块。在此虚拟主机中包含的ServerName和DocumentRoot应与全局ServerName和DocumentRoot相同。将此虚拟主机列在配置文件中的第一位,以便它充当默认主机。

例如,为了使XAMPP正常工作,并防止VirtualHost覆盖主机,请将以下行添加到文件httpd-vhosts.conf中:

# Main host
<VirtualHost *:80>
    ServerName localhost
    DocumentRoot "/xampp/htdocs"
</VirtualHost>

# Additional host
<VirtualHost *:80>
    # Over directives there
</VirtualHost>

实际上,我没有使用ServerName localhost,只是复制了(从httpd.conf)DocumentRoot<Directory部分,它工作得很好 - 与以前所有主机相同,除了较低的<VirtualHost *:80>标签中的ServerNameAlias - Íhor Mé
非常有帮助,谢谢 :D :D 现在我可以同时使用本地主机和自定义虚拟主机了。 - CuongDC

10
我曾遇到在使用虚拟主机时无法访问本地主机的问题。我通过在虚拟主机监听代码中添加名称解决了这个问题,例如下面所示: 在我的hosts文件(C:\Windows\System32\drivers\etc\hosts)中,我添加了如下代码:
127.0.0.1   main_live

而在我的httpd.conf文件中,我已经添加了以下代码:

<VirtualHost main_live:80>
    DocumentRoot H:/wamp/www/raj/main_live/
    ServerName main_live
</VirtualHost>

完成了。它能正常工作,我可以同时使用localhostphpmyadminmain_live(我的虚拟项目)。


对我有用。谢谢 @Raj - madhan kumar
修改hosts文件在这里很重要。 - Vohidjon Karimjonov
在我的情况下,第一次在浏览器上访问 main_live 没有成功。然后我尝试了 http://main_live,它起作用了。然后 main_live(不带 http)也开始工作了。非常奇怪。 - Vohidjon Karimjonov
@Vohidjon Karimjonov:我认为需要浏览器访问权限才能工作。因此,您可能已经允许浏览器监听“main_live”的请求,然后它才开始作为网站工作,否则它只被视为关键字。因此,当您插入http://main_live时,它会查找主机文件中是否有“main_live”的条目,如果找到,则浏览器将仅要求您授予权限,如果授予权限,则您将获得虚拟主机工作并加载Web应用程序的主页。让它为您工作。太棒了! - Raj

5

对于那些按照这里描述的步骤仍然无法访问的人:

使用Apache 2.4的XAMPP:

在文件httpd-vhost.conf中:

<VirtualHost *>
    DocumentRoot "D:/xampp/htdocs/dir"
    ServerName something.dev
   <Directory "D:/xampp/htdocs/dir">
    Require all granted #apache v 2.4.4 uses just this
   </Directory>
</VirtualHost>

这里不需要端口或IP地址,Apache会在自己的文件中进行配置。不需要使用NameVirtualHost *:80;它已经过时了。您可以使用它,但没有任何区别。
然后要编辑hosts文件,您必须以管理员身份运行Notepad(下面有描述)。如果您在没有这样做的情况下编辑文件,则正在编辑伪文件而不是原始文件(是的,它保存等等,但它不是真正的文件)
在Windows中:
找到记事本图标,右键单击,以管理员身份运行,打开文件,转到C:/ WINDOWS / system32 / driver / etc / hosts,勾选“查看所有文件”,并打开hosts。
如果您之前编辑过它,很可能会发现当未以管理员身份运行时,它不是您之前编辑的文件。

接下来,要检查Apache是否正在读取您的httpd-vhost.conf文件,请前往xampFolder/apache/bin文件夹,Shift + 右键单击,在此处打开终端命令,打开XAMPP(通常情况下),启动Apache,然后在命令行中输入httpd -S。您将看到虚拟主机列表。只需检查您的something.dev是否在其中。


3
只需将<VirtualHost *:80>更改为<VirtualHost 127.0.0.1:80>即可。 然后默认的DocumentRoot将为指向您的服务器的所有域名或IP地址提供服务,并且指定的VirtualHost将起作用。

3

1
我已经添加了指令,但是没有任何变化:当我打开http://localhost/时,我看到的网站配置为http://www.mysite.local。 - Angelica Rosa

1
可能是因为您的网页文件夹(如提到的“/Applications/MAMP/htdocs/mysite/web”)是空的。
我的建议是先创建您的项目,然后再开始制作虚拟主机。
我曾经遇到过类似的情况。我在httpd-vhosts.confizDocumentRoot中使用了一个空文件夹,但我无法访问我的shahg101.com网站。

1
五月并不是一个明确的答案,需要使用精确的解决方案来帮助。 - Mostafiz
只有在文件夹中有INDEX.php文件时,才会创建虚拟驱动器,因此我是在说您的文件夹可能是空的(不包含index.php文件)。 - Shahmir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接