为什么在Apache中设置虚拟主机后,http:// localhost会重定向到我的默认虚拟主机?

时间:2009-02-09 01:05:42

标签: apache http

这可能是一个简单的问题,但我想更好地了解Apache如何与虚拟主机协同工作。我正在设置虚拟主机,因为我一次在多个网站上工作,我不想使用子目录。我几乎使用默认的Apache httpd.conf文件,DocumentRoot指向“/ www”之类的东西。我取消注释了虚拟主机包含并添加了以下内容:

NameVirtualHost *:80

<VirtualHost *:80>
    ServerName site1.dev
    DocumentRoot /www/site1
</VirtualHost>

<VirtualHost *:80>
    ServerName site2.dev
    DocumentRoot /www/site2
</VirtualHost>

现在,当我转到http://localhost时,我会获得site1的默认页面。

我确信这是有道理的,但我不太明白。我原以为只有明确要求http://site1.test的请求才能通过该指令进行路由,并且它不会成为默认值。有人可以解释为什么它成为默认值。

5 个答案:

答案 0 :(得分:11)

http://httpd.apache.org/docs/1.3/vhosts/name-based.html

(对于2.x也应如此)

“如果找不到匹配的虚拟主机,则将使用与IP地址匹配的第一个列出的虚拟主机。

因此,第一个列出的虚拟主机是默认的虚拟主机。当IP地址与NameVirtualHost指令匹配时,永远不会使用主服务器的DocumentRoot。如果您希望对与任何特定虚拟主机不匹配的请求进行特殊配置,只需将该配置放入容器中,然后将其列在配置文件中。“

答案 1 :(得分:4)

答案1是正确的 我将添加namevirtualhosts作为第一个条目 基本上匹配任何未命名的其他虚拟主机

它只能用于捕捉无意识的错误形成和破坏的流量

即一个名为john.domain.com的machene运行www.domain.com和www.domain2.com作为IP www.xxx.yyy.zzz上的有效网络服务器可能具有最佳配置,如此

    <VirtualHost *:80>
     DocumentRoot /var/webserver/static-sites/unknown/
    # a directory readable by apache with only a robots.txt denying everything
     ServerName bogus
     ErrorDocument 404 "/errordocuments/unknown-name.html"
    #custom 404 describing how/what they might have done wrong try pointing a browser {with a hosts file at http://bogus/ on 193.120.238.109 to see mine#
     ErrorLog /var/log/httpd/unknown-error.log
     CustomLog /var/log/httpd/unknown-access.log combined
    </VirtualHost>

    <VirtualHost *:80>
     DocumentRoot /var/webserver/static-sites/unknown/
    # a possibly different directory readable by apache with only a robots.txt denying everything
     ServerName www.xxx.yyy.zzz
     ServerAlias john.domain.com
     ErrorDocument 404 "/errordocuments/ip-name.html"
     ErrorDocument 403 "/errordocuments/ip-name.html"
    #custom 404 telling them as a likely hacker/bot you wish to have nothing to do with them see mine at http://193.120.238.109/
     ErrorLog /var/log/httpd/ip-error.log
     CustomLog /var/log/httpd/ip-access.log combined
    </VirtualHost>

    <VirtualHost *:80>
     ServerName domain.com
     RedirectPermanent / http://www.domain.com/
     ErrorLog logs/www.domain.com-error.log
     CustomLog logs/www.domain.com-access.log combined
    </VirtualHost>

    <VirtualHost *:80>
     DocumentRoot /var/webserver/ftpusers/domain
     ServerName www.domain.com
     ServerPath /domain
     ErrorLog logs/www.domain.com-error.log
     CustomLog logs/www.domain.com-access.log combined
    </VirtualHost>

    <VirtualHost *:80>
     ServerName domain2.com
     RedirectPermanent / http://www.domain2.com/
     ErrorLog logs/www.domain2.com-error.log
     CustomLog logs/www.domain2.com-access.log combined
    </VirtualHost>

    <VirtualHost *:80>
     DocumentRoot /var/webserver/ftpusers/domain2
     ServerName www.domain2.com
     ServerPath /domain2
     ErrorLog logs/www.domain2.com-error.log
     CustomLog logs/www.domain2.com-access.log combined
    </VirtualHost>

答案 2 :(得分:3)

确认对于Apache 2.x,如果找不到匹配的虚拟主机,将使用第一个虚拟主机(具有相同的端口号)。

http://httpd.apache.org/docs/2.2/vhosts/details.html

  

“如果找不到匹配的vhost,请求将从第一个vhost提供,该端口号与客户端连接的IP列表中的匹配端口号”

您始终可以在下面添加此代码,将其放在NameVirtualHost *:80下方,以便在未找到其他虚拟主机时默认提供默认文档根目录。

<VirtualHost *:80>
    ServerName localhost
    DocumentRoot /my/default/document/root
</VirtualHost>

答案 3 :(得分:0)

一种方法是:

  1. 在VirtualHosts配置中,输入要启用的特定本地站点名称,而不是使用通配符: <VirtualHost site1.dev:80>代替<VirtualHost *:80>

  2. 关闭NameVirtualHost *:80,这可以通过在vhosts.conf文件中注释来完成

  3. 在/ etc / hosts文件中提及环回IP的两个别名: 127.0.0.1 localhost site1.dev

  4. 就是这样。您应该看到localhost像往常一样转到默认的DocumentRoot,而site1.dev转到您设置为虚拟主机的站点。

答案 4 :(得分:0)

只需将此代码放在httpd-vhosts.conf中的顶部

<VirtualHost localhost:80>
    ServerName localhost
    DocumentRoot d:/xampp/htdocs
    <Directory  "d:/xampp/htdocs/">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require local
    </Directory>
</VirtualHost>