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