我试图使用基于名称的虚拟主机设置一个子域,根据这个问题的configuration格式。
据我所知,这个:
最后,可以通过在容器中放置其他指令来微调虚拟主机的configuration。 大多数指令都可以放在这些容器中,然后只更改相关虚拟主机的configuration。 要确定是否允许某个指令,请检查该指令的上下文。 在主服务器上下文(在任何容器之外)中设置的configuration指令只有在不被虚拟主机设置覆盖时才会使用。
应该意味着从单个主机移动到1个主机+ 1个子域的任务应该相当简单。 但是,当我添加VirtualHost指令时,我遇到了问题。
首先(和相当灾难性的)是主域的主页返回403(禁止)。 以下任一情况可能导致:
httpd.conf末尾附近,就在虚拟主机的注释指令之后 VirtualHost之后的文件中有很多Redirect和Rewrite – 它们会发生冲突吗? VirtualHost指令中,因为我希望尽可能简单。 将旧的httpd.conf的内容移动到一个单独的文件(例如main-domain.conf)会更好吗?将其Include在一个VirtualHost并为子域创build一个单独的conf文件,包括在第二个VirtualHost指示? 更新
好的,错误是,更具体地说:
目录索引被规则禁止
其他页面似乎工作正常,所以它必须是从主页redirect的某种问题。 我想这就是为什么我问是否有已知的VirtualHost设置和Redirect s / Rewrite之间的冲突。
如果一个与VirtualHost块中的DocumentRoot匹配的<Directory "/path/to/docroot">块在后者之前或之后(或者没有关系)?
更新2
好的,所以看起来好像没有发生以下redirect:
RewriteRule ^/$ /path/to/something/else [PT]
我猜的原因有两个:
当前的configuration甚至没有尝试处理这个重写过程。 该规则本身位于VirtualHost块之后的Include d文件中。
该规则不再匹配,因为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,则需要一个与您的基本服务器文档根目录相似的新节。