Apache:没有指定路径的<directory>指令</directory>

时间:2013-12-15 04:51:51

标签: apache directory virtualhost httpd.conf directive

我在使用MAMP的OS X计算机上运行了本地服务器环境,我目前正在设置一些虚拟主机。我发现,为了让我的一个虚拟主机能够识别我的网站的.htaccess文件,我需要在<Directory>指令中添加<VirtualHost>指令。

以下是我用于配置其中一个虚拟主机的示例:

<VirtualHost *>
    DocumentRoot "/path/to/mysite"
    ServerName mysite.local
    <Directory "/path/to/mysite">
        AllowOverride All
        Order Allow,Deny
        Allow from all
    </Directory>
</VirtualHost>

现在,我想通过从<Directory>指令中删除路径来避免冗余。我试过这样做似乎工作,虽然我不熟悉Apache足以知道这样做的潜在后果。此外,我在Apache文档中找不到对此案例的解释。

这就是喜欢做的事情:

<VirtualHost *>
    DocumentRoot "/path/to/mysite"
    ServerName mysite.local
    <Directory>
        AllowOverride All
        Order Allow,Deny
        Allow from all
    </Directory>
</VirtualHost>

因此,我的问题是:当我省略<Directory>指令的路径时(在这种情况下)会发生什么?

1 个答案:

答案 0 :(得分:1)

Directory是一个针对文件系统目录的指令,应该始终有一个路径(允许使用waildcards)。

使用某些目标指向无目录的指令可能会被静默丢弃,或者可能会出错(您可以测试它),但肯定会无用

为什么要编写一些针对无目录的配置说明

但你的问题可能还有更多。

通常,Virtualhost应该包含至少一个Directory指令,DocumentRoot目录,通常我们还会添加一个以文件系统根目录为目标的指令:

<Directory />
    (instructions to deny access and avoid .htaccess reads)
</Directory>
<Directory /my/document/root/>
    (instructions to allow access and still avoid .htaccess reads or to allow them if you are lazy and feel over confident that .htaccess are useful in any way and you do not need speed)
</Directory>

您可以添加更多内容,尤其是为了避免使用.htaccess文件,因为/path/to/somewhere中存储的文件与<Directory /path/to/somewhere>部分相同,但速度较慢。

现在你不想在你的VH配置中重复自己,所以你可能会使用.htaccess文件或全局级别指令来处理通常设置的内容。您还可以使用另一个神奇的关键字,即位置

您可以在<Location /foo>指令中使用大量Apache指令。位置适用于URL,而不适用于文件系统路径。

因此<Location />是您的documentRoot,而<Location /foo>可能是您DocumentRoot下的子目录'foo'。这可以帮助您在VH中编写内容,而无需在任何地方重复使用documentmentroot前缀。但小心,网址不是文件系统路径。与在目录级别上应用的保护相比,应用于URL级别的任何保护可能更弱或更强。这取决于你的别名,你使用网址的方式等等。

<强>更新

如果您使用新的Apache 2.4 版本,现在可以使用mod_macro或更简单,built-in variables support

Define docroot "/path/to/mysite"
DocumentRoot ${docroot}
<Directory ${docroot}>
    (...)