组织虚拟主机的httpd.conf

我试图使用基于名称的虚拟主机设置一个子域,根据这个问题的configuration格式。

据我所知,这个:

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

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

首先(和相当灾难性的)是主域的主页返回403(禁止)。 以下任一情况可能导致:

  • 现有的主域有一个很大的configuration文件,有很多设置。 我将虚拟主机指令放在httpd.conf末尾附近,就在虚拟主机的注释指令之后
  • VirtualHost之后的文件中有很多RedirectRewrite – 它们会发生冲突吗?
  • 我已经把绝对的最低限度放在了VirtualHost指令中,因为我希望尽可能简单。 将旧的httpd.conf的内容移动到一个单独的文件(例如main-domain.conf)会更好吗?将其Include在一个VirtualHost并为子域创build一个单独的conf文件,包括在第二个VirtualHost指示?
  • 最后,是否有任何简单的方法来debugging,记住我正在使用一个活的网站,所以任何变化都必须非常快速地进行testing!

更新

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

目录索引被规则禁止

其他页面似乎工作正常,所以它必须是从主页redirect的某种问题。 我想这就是为什么我问是否有已知的VirtualHost设置和Redirect s / Rewrite之间的冲突。

如果一个与VirtualHost块中的DocumentRoot匹配的<Directory "/path/to/docroot">块在后者之前或之后(或者没有关系)?

更新2

好的,所以看起来好像没有发生以下redirect:

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

我猜的原因有两个:

  1. 当前的configuration甚至没有尝试处理这个重写过程。 该规则本身位于VirtualHost块之后的Include d文件中。

  2. 该规则不再匹配,因为VirtualHost指令导致模式匹配失败。 对我来说,这似乎是最有可能的…

更新3

任何人都认为这可能是相关的?

请注意,默认情况下,重写configuration不会被inheritance。 这意味着您需要为每个您希望使用它的虚拟主机启用RewriteEngine on指令。

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

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

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

更新4

不幸的是,更新3中提到的改变根本不能解决问题

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

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

然后创build两个目录:

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

然后你可以根据需要创build尽可能多的虚拟主机,每个文件一个:

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

现在,您可以使用启用了网站的目录中的符号链接打开和closures网站:

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

你可以testing你的configuration:

apachectl configtest

至less应该告诉你,如果你在语法上是正确的。

安德鲁

这里最重要的一点是,当你没有虚拟主机的时候,基本的configuration就是默认的虚拟主机。

通常(不添加新的接口或端口)当你去添加你的第一个虚拟主机,你实际上需要添加两个。 一个捕获正在达到基本configuration的stream量,另一个捕获新的stream量。

如果你不这样做,你可能会发现你为新域名添加的虚拟主机处理所有的stream量 – 如果它仍然是一个进行中的工作,你可能会看到403s。

所以从一个无虚拟主机configuration:

 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> 

请记住,如果添加新的Alias或DocumentRoot,则需要一个与您的基本服务器文档根目录相似的新节。