我有一个问题,看起来应该很简单。我想将一组配置指令应用于单个文件(在本例myfile.html
中为 DocumentRoot)。可能还有包含 的子目录myfile.html
,这些不应该得到配置。我也想在不使用Location
or的情况下做到这一点LocationMatch
。
我想出了以下
DocumentRoot "/home/amoe/opt/httpd/htdocs"
<DirectoryMatch "^/home/amoe/opt/httpd/htdocs$">
<Files "myfile.html">
ExpiresActive on
ExpiresDefault A10
</Files>
</DirectoryMatch>
但是,Expires
请求时没有设置标头/myfile.html
。在 上添加斜杠DirectoryMatch
似乎没有什么区别。
您可以假设我想在没有Location
学术原因的情况下这样做。(编辑:另外,引用文档,重要的是在尝试限制对文件系统中对象的访问时永远不要使用。)
我发现完成这项工作的唯一方法是使用以下内容:
我相信
[^/]+
不需要额外的东西来让它工作,请参阅下面关于我如何得出这个结论的完整解释,因此我相信这是 Apache 中的一个错误。以下所有内容均基于运行 Apache 2.4.23 的 Ubuntu 16.04.1 LTS 环境,测试文件位于以下位置:
/path/test/test.html
/path/test/noheader-test.html
/path/test/child/test.html
/path/test/child/grandchild/test.html
首先,我尝试了许多不同的正则表达式变体,所有这些变体都不匹配:
但是我发现,如果您省略 EOL 锚 (
$
),那么它匹配:但是,这当然匹配
test.html
所有子目录中的文件:/path/test/test.html
-发送过期标头/path/test/noheader-test.html
- 没有发送过期标头/path/test/child/test.html
-发送过期标头/path/test/child/grandchild/test.html
-发送过期标头就好像路径中有其他东西正则表达式不匹配,因为当我将正则表达式更改为
^/your/path/test/.+$
匹配时。想知道路径中缺少的部分是什么,我使用了正则表达式捕获组和
Header
指令让 Apache 告诉我缺少什么,如下所示:这给出了以下标题:
/path/test/test.html
-x-test:"test.html"
/path/test/noheader-test.html
- 没有发送标题/path/test/child/test.html
-x-test:"child/test.html"
/path/test/child/grandchild/test.html
-x-test:"child/grandchild/test.html"
这表明
DirectoryMatch
也匹配文件名?!在 Apache 错误跟踪器上,错误 41867有点符合这个描述,所以可以解释一下(我也在没有嵌套
<Files>
指令的情况下对此进行了测试,并且标题值保持不变)因此,为了证明这一点,我尝试
test.html
像这样替换正则表达式:没有
X-TEST
返回标头。然而,这确实意味着可以使正则表达式匹配我们感兴趣匹配的目录之后不是目录的任何内容,如下所示:
这会在所有所需位置提供标题:
/path/test/test.html
-发送过期标头/path/test/noheader-test.html
- 没有发送过期标头/path/test/child/test.html
- 没有发送过期标头/path/test/child/grandchild/test.html
- 没有发送过期标头