AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 82306
Accepted
SJaguar13
SJaguar13
Asked: 2009-11-07 10:36:58 +0800 CST2009-11-07 10:36:58 +0800 CST 2009-11-07 10:36:58 +0800 CST

Apache 默认/包罗万象的虚拟主机?

  • 772

如果我有 3 个域,domain1.com、domain2.com 和 domain3.com,是否可以为未列出的域设置默认虚拟主机?例如,如果我有:

<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/domain1
ServerName domain1
ServerAlias host
</VirtualHost>

<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/domain2
ServerName domain2
ServerAlias host
</VirtualHost>

<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/everythingelse
ServerName *
ServerAlias host
</VirtualHost>

如果您注册一个域并将其指向我的服务器,它将默认显示与 domain3 相同的所有内容。那可能吗?

apache-2.2 virtualhost
  • 10 10 个回答
  • 116973 Views

10 个回答

  • Voted
  1. Jason Blevins
    2012-03-27T15:06:44+08:002012-03-27T15:06:44+08:00

    使用基于名称的虚拟主机时,加载的第一个虚拟主机配置将是默认配置(来源:Apache Wiki)。例如,使用下面的配置,否则不匹配的域将匹配domain-one.com:

    NameVirtualHost *:80
    
    <VirtualHost *:80>
      ServerName domain-one.com
      # Other options and directives ..
    </VirtualHost>
    
    <VirtualHost *:80>
      ServerName domain-two.com
      # Other options and directives ..
    </VirtualHost>
    

    许多服务器没有单一的配置文件,但有几个特定于主机的配置文件,组织如下:

    /etc/apache2
    |-- sites_available  (actual configuration files)
    `-- sites_enabled    (symlinks to files in sites_available)
    

    在这种情况下,要首先加载特定的虚拟主机配置,请将符号链接重命名为排序时将首先加载的内容,例如00-default.


    其他一些答案并不完全正确。根据 Apache Wiki,不在ServerName虚拟主机中设置 a是不正确的。如果ServerName没有首先加载没有 a 的主机,Apache 甚至可能永远不会使用它,因为第一个加载的主机将是默认值。

    此外,虽然ServerAlias *确实会匹配任何东西,但它也可能会覆盖稍后定义的其他虚拟主机。如果它始终是要定义的最后一个虚拟主机(如问题中给出的配置),也许这种方法会起作用,但这意味着添加一个新指令并更改排序顺序,而不是像上面那样仅更改顺序。

    • 94
  2. Best Answer
    freiheit
    2009-11-07T10:40:54+08:002009-11-07T10:40:54+08:00

    是的,这应该可以,除了 ServerAlias 应该是“*”,ServerName 设置为实际的主机名。您可能需要确保 VirtualHost 是最后加载的...

    • 45
  3. Vid Luther
    2009-11-07T16:32:27+08:002009-11-07T16:32:27+08:00

    不要指定服务器名称,这将成为您的默认虚拟主机..

    <VirtualHost *:80>
    ServerAdmin webmaster@localhost
    
    DocumentRoot /var/www
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory /var/www/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>
    </VirtualHost> 
    

    还要确保您没有在主 httpd.conf 文件中指定 DocumentRoot,因为这将优先于虚拟主机。

    • 7
  4. Ray
    2009-11-07T17:07:12+08:002009-11-07T17:07:12+08:00

    顺序很重要 - 将其他所有内容的虚拟主机定义移到列表的开头。

    • 2
  5. ErikE
    2013-11-14T08:03:53+08:002013-11-14T08:03:53+08:00

    按照http://httpd.apache.org/docs/2.2/vhosts/examples.html的规定,使用 _default_ 虚拟主机并将其放在 httpd-vhosts.conf 中

    “捕获对任何未指定 IP 地址和端口的每个请求,即不用于任何其他虚拟主机的地址/端口组合 [...] 默认 vhost 永远不会为发送到地址/端口的请求提供服务"

    来自实时但经过混淆的 httpd-vhosts.conf 的片段,恰好将所有虚拟主机锁定到端口 80:

    # Listen for virtual host requests on all IP addresses.
    # This directive cannot be removed:
    NameVirtualHost *:80
    
    <VirtualHost _default_:80>
    # This vhost catches client requests with host headers which have
    # not been matched by ServerName or ServerAlias directives in other vhosts.
    #
    # We redirect all such requests to a particular named vhost:
        RewriteCond %{HTTP_HOST}    ^(.*)$
        RewriteRule ^(.*)$  http://my.site.of.choice [R=permanent,L]
    </VirtualHost>
    
    # Name based vhosts here:
    <VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName  my.other.site
        ServerAlias my.other.site2 my.other.site3
    </VirtualHost>
    
    # more vhosts etc...
    

    可以在这里找到对 vhost 匹配过程的深入解释:http ://httpd.apache.org/docs/2.2/vhosts/details.html

    • 2
  6. Jason Slobotski
    2016-05-26T08:50:12+08:002016-05-26T08:50:12+08:00

    通配符包括您的站点配置文件:

    Include path/to/site/confs/*httpd.conf
    

    组织您的站点 conf 文件,以便按预期顺序加载它们。例子...

    01-httpd.conf

    02-site1-httpd.conf

    03-site2-httpd.conf

    ETC...

    Apache 将按顺序阅读这些内容。然后创建一个总是最后加载的,以捕获任何不匹配的虚拟主机并返回 404 而不是加载默认站点。

    99-catchall-httpd.conf

    <VirtualHost *:8080>
     ServerName null
     ServerAlias *
     Redirect 404 /
    </VirtualHost>
    
    <VirtualHost *:8443>
     ServerName null
     ServerAlias *
     Redirect 404 /
    </VirtualHost>
    

    请务必将这些端口替换为您的 httpd 侦听的任何端口。或者,如果您有 httpd 侦听特定接口,则需要为每个接口添加一个包罗万象,如下所示:

    <VirtualHost 192.168.1.101:8080>
     ServerName null
     ServerAlias *
     Redirect 404 /
    </VirtualHost>
    <VirtualHost 192.168.1.101:8443>
     ServerName null
     ServerAlias *
     Redirect 404 /
    </VirtualHost>
    
    <VirtualHost 192.168.1.102:8080>
     ServerName null
     ServerAlias *
     Redirect 404 /
    </VirtualHost>
    
    <VirtualHost 192.168.1.102:8443>
     ServerName null
     ServerAlias *
     Redirect 404 /
    </VirtualHost>
    

    希望这可以帮助。我使用此方法按我指定的顺序加载站点,并防止不匹配的虚拟主机无意中加载意外站点。

    • 2
  7. xoompa
    2013-11-14T03:02:26+08:002013-11-14T03:02:26+08:00

    最好的解决方案是重命名以“1”开头的站点配置文件,以便它首先加载,这将是您的默认站点。

    Apache2 将第一个加载的 vhost 文件作为默认页面。

    • 0
  8. alan
    2017-03-06T17:42:18+08:002017-03-06T17:42:18+08:00

    <VirtualHost *:port>在为您关心的主机使用和指定 ServerName/ServerAlias 时,这是我需要做的。

    我的情况的一些背景:

    我有一个来自我的 ISP 的动态 IP 地址,所以我的 IP 地址是在动态 IP 地址注册公司(在我的例子中是 noip.org)注册的。我的“主机”之一需要在我的 DNS 注册中注册为 myabc.example.com 作为指向 host1.ddns.net 的 CNAME。但是 host2.ddns.net 保持原样。我希望 myabc.example.com 和 host1.ddns.net 去 site1 和 host2.ddns.net 去站点 2 和其他任何东西,包括我的 IP 地址去默认。

    读取的第一个 conf 文件将是默认值,即000_def.conf,将按该顺序读取,并001_site1.conf作为默认站点。(注意:在我的情况下,我有这些“文件”,其中实际上是指向实际 conf 文件的动态链接)002_site2.conf000_def.conf/etc/apache2/sites-enabled/etc/apache2/sites-available

    因为在 001_site1.conf 和 002_site2.conf 中使用了 ServerName,所以它也必须在 000_def.conf 中设置为某个值。

    # 000_def.conf:
    <VirtualHost *:80>  
    ServerName null
    # NOTE: DO NOT USE "ServerAlias *" this seems to override the other conf files.
    </VirtualHost>
    
    
    # 001_site1.conf
    <VirtualHost *:80>  
    ServerName myabc.example.com
    ServerAlias mylocalhostname host1.ddns.net
    </VirtualHost>
    
    
    # 002_site2.conf:
    <VirtualHost *:80>  
    ServerName host2.ddns.net
    </VirtualHost>
    
    • 0
  9. fbitterlich
    2020-08-01T02:50:44+08:002020-08-01T02:50:44+08:00

    除了这里给出的答案(尤其是来自@Jason Blevins 的答案)之外,这里还有一个潜在的陷阱。我花了一些时间才弄清楚这一点。

    如前所述,如果没有其他条目与or指令匹配,Apache 将使用第一个VirtualHost 条目。HostNameHostAlias

    但是,当您混合绑定到特定 IP 地址的虚拟主机和一些不绑定的虚拟主机时要小心(<VirtualHost 192.168.1.1:80>vs. <VirtualHost *:80>)。

    如果向具有一个或多个 IP 绑定虚拟主机的 IP 地址发出请求,它将使用与该地址绑定的第一个 VirtualHost 条目,即使它不是第一个。换句话说,在 IP 地址匹配中,更具体的匹配也优于非特定的匹配。

    例子

    <VirtualHost *>
    DocumentRoot /www/docs/domain1
    ServerName host1.exmple.com
    ServerAlias host
    </VirtualHost>
    
    <VirtualHost 192.168.1.1>
    DocumentRoot /www/docs/domain2
    ServerName host2.exmple.com
    ServerAlias host
    </VirtualHost>
    

    如果向 host 发出请求foobar.example.com,并且解析为 192.168.1.1,则 Apache 将从 /www/docs/domain2 提供服务,这可能是意外的。

    为了解决这个问题,要么...

    • 使所有虚拟主机 IP 独立 ( <VirtualHost *>),或
    • 为每个服务的 IP 地址添加一个单独的默认 VirtualHost 条目。

    如果有疑问,请运行apachectl -S(或任何适合您系统的命令)以获取 VirtualHosts 列表。它会告诉你哪一个被用作默认值。

    • 0
  10. kmiklas
    2022-08-18T22:39:34+08:002022-08-18T22:39:34+08:00

    土豚技术

    在 Apache 2.4.x、Ubuntu 20.04 上,没有httpd.conf文件。

    虚拟托管站点使用 配置/etc/apache2/sites-available/,并使用符号链接启用/etc/apache2/sites-enabled,我使用以下技术来解决默认主机故障。

    设置一个名为aardvark.aaa的虚假站点并将其映射到默认页面。它之所以有效,是因为在 Apache2 中,虚拟主机是按字母顺序加载的,而 aardvark.aaa 将是第一个。(如果您有一个名为 aaa.com 的网站,那么您就不走运了 :^)

    1. 复制/etc/apache2/sites-available/000-default.conf到/etc/apache2/sites-available/aardvark.aaa.conf.

    sudo cp 000-default.conf aardvark.aaa.conf

    像这样配置

        ServerAdmin [email protected]
        ServerName aardvark.aaa
        ServerAlias www.aardvark.aaa
        DocumentRoot /var/www/aardvark
    
    1. 在 /etc/apache2/sites-enabled/ 中创建一个符号链接到~/sites-available. 这将导致网站被启用、加载并在浏览器中可见:

    ln -s ../sites-available/aardvark.aaa.conf

    1. 像这样在 /var/www/ 中创建一个 /var/www/aardvark/index.html 文件

      $猫> index.html

      你好世界

    [CTRL-D]

    1. 反弹你的服务器

      $ sudo systemctl 重启 apache2

    2. 确认aardvark.aaa先用这个命令加载

      $ sudo apache2ctl -S

      root@ip-172-26-2-167:/etc/apache2/sites-enabled# sudo apache2ctl -S VirtualHost 配置:*:80 是 NameVirtualHost 默认服务器 aardvark.aaa (/etc/apache2/sites-enabled/aardvark .aaa.conf:1) 端口 80 namevhost aardvark.aaa (/etc/apache2/sites-enabled/aardvark.aaa.conf:1) 别名www.aardvark.aaa

    3. 浏览到您的主机/IP 地址。你应该看到:

      你好世界

    • 0

相关问题

  • 在您分发的应用程序中使用 Apache HTTPD 运行 SSL 的最佳方式是什么?

  • 阿帕奇的替代品

  • 如何强制我的网址始终以 www 开头?

  • 在 Linux Xen VPS 上优化 Apache 和 MySQL

  • mod_rewrite 不转发 GET 参数

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve