为虚拟主机组织 httpd.conf

为虚拟主机组织 httpd.conf

我正在尝试使用基于名称的虚拟主机设置子域,根据配置格式这个问题

据我了解,这是:

最后,您可以通过将其他指令放入容器内来微调虚拟主机的配置。大多数指令都可以放在这些容器中,然后只会更改相关虚拟主机的配置。要确定是否允许使用特定指令,请检查该指令的上下文。主服务器上下文(任何容器之外)中设置的配置指令只有在未被虚拟主机设置覆盖的情况下才会使用。

应该意味着从单个主机移动到 1 个主机 + 1 个子域的任务应该相当简单。但是,当我添加 VirtualHost 指令时,我遇到了问题。

首先(也是相当灾难性的)是主域的主页返回 403(禁止访问)。以下任何原因都可能导致此问题:

  • 现有的主域有一个很大的配置文件,包含许多设置。我将VirtualHost指令放在末尾附近httpd.conf,就在注释掉的虚拟主机指令之后
  • 文件中有很多Redirects 以及包含在s 后面的 s - 它们会发生冲突吗?RewriteVirtualHost
  • 我在指令中放置了绝对最少的VirtualHost内容,因为我想让它尽可能简单。将旧内容httpd.conf移到一个单独的文件(例如 main-domain.conf)Include中,然后VirtualHost为子域创建一个单独的 conf 文件,将其包含在第二个VirtualHost指令中,这样会更好吗?
  • 最后,有没有什么简单的方法可以调试这个问题,请记住我正在使用实时网站,所以任何更改都必须非常快速地进行测试!

更新

好的,错误更具体地说是:

规则禁止的目录索引

其他页面似乎运行正常,所以一定是主页重定向出了问题。我想这也是我询问 VirtualHost 设置和Redirects / Rewrites 之间是否存在已知冲突的原因之一。

与块中的<Directory "/path/to/docroot">匹配的块应该位于后者之前还是之后(或者无所谓)?DocumentRootVirtualHost

更新 2

好的,看起来不是发生以下重定向:

RewriteRule ^/$ /path/to/something/else [PT]

我猜测发生这种情况有两个原因:

  1. 当前配置甚至没有尝试处理此重写规则。规则本身位于Included 文件中,位于VirtualHost块之后。

  2. 该规则不再匹配,因为VirtualHost指令导致模式匹配失败。在我看来,这是迄今为止最有可能的...

更新 3

有人认为这可能相关吗?

请注意,默认情况下,重写配置不会被继承。这意味着您需要为每个要使用的虚拟主机设置一个 RewriteEngine on 指令。

换句话说,这是否意味着我需要:

<VirtualHost *:80>
    RewriteEngine on
</VirtualHost>

对于每个需要处理 Rewrite* 内容的 VH,而不是仅仅依赖RewriteEngine on于全局包含的文件?

更新 4

遗憾的是,更新 3 中提到的更改根本没有解决问题

答案1

我总是将我的虚拟主机拆分成单独的目录文件。在 httpd.conf 中有一行:

Include /etc/httpd/sites-enabled/*.conf

然后创建两个目录:

mkdir -p /etc/httpd/sites-{enabled,available}

然后,您可以根据需要创建任意数量的虚拟主机,每个文件一个:

/etc/httpd/sites-available/site1.conf /etc/httpd/sites-available/site2.conf

现在您可以使用 sites-enabled 目录中的符号链接打开和关闭网站:

ln -s /etc/httpd/sites-available/sites2.conf /etc/httpd/sites-enabled/

您可以使用以下方法测试您的配置:

apachectl configtest

它至少可以告诉你语法是否正确。

安德鲁

答案2

这里最重要的问题是,当您没有虚拟主机时,基本配置将充当您的默认虚拟主机。

通常(不添加新接口或端口)当您添加第一个虚拟主机时,您实际上需要添加两个。一个用于捕获击中基本配置的流量,另一个用于捕获新流量。

如果你不这样做,你可能会发现你为新域添加的虚拟主机处理了所有的流量 - 并且如果它仍在进行中,你可能会看到 403。

因此从无虚拟主机配置来看:

NameVirtualHost *:80
# This first vhost captures all traffic to port 80 if it doesn't match
# the ServerName/ServerAlias of another VH :80. <virtualhost *:80>. It acts
# like the base server config before you added vhosts
<virtualhost *:80>
ServerName example.com 
# not much else, inherit from base
</virtualhost>

<virtualhost *:80> 
ServerName other.example.com 
... 
</virtualhost>

请记住,如果您添加新的别名或 DocumentRoot,则需要一个与基本服务器文档根目录完全一样的新部分。

相关内容