我有一个问题,它应该是简单的。 我想将一组configuration指令应用于单个文件(本例中为DocumentRoot中的myfile.html )。 也可能有包含myfile.html子目录,这些不应该得到configuration。 我也想不使用Location或LocationMatch 。
我想出了以下几点
DocumentRoot "/home/amoe/opt/httpd/htdocs" <DirectoryMatch "^/home/amoe/opt/httpd/htdocs$"> <Files "myfile.html"> ExpiresActive on ExpiresDefault A10 </Files> </DirectoryMatch>
但是,在请求/myfile.html时, Expires标题不会被设置。 在DirectoryMatch上添加一个斜杠似乎没有什么区别。
你可以假设,我想这样做,没有学术理由的Location 。 (编辑:另外,为了引用文档, 当试图限制对文件系统中对象的访问时,永远不要使用它。 )
我发现做这项工作的唯一方法是使用以下方法:
<DirectoryMatch ^/home/amoe/opt/httpd/htdocs/[^/]+$> <Files "test.html"> ExpiresActive on ExpiresDefault A10 </Files> </DirectoryMatch>
我相信额外的[^/]+不应该被要求得到这个工作,见下面的完整解释我是如何得出这个结论,因此我相信这是一个在Apache中的错误。
以下所有内容均基于运行Apache 2.4.23的Ubuntu 16.04.1 LTS环境,并在这些位置包含testing文件:
/path/test/test.html /path/test/noheader-test.html /path/test/child/test.html /path/test/child/grandchild/test.html 首先,我尝试了许多不同的正则expression式变体,所有这些变体都不匹配:
<DirectoryMatch ^/path/test$> <DirectoryMatch ^/path/test/$> <DirectoryMatch /path/test/$> <Directory ~ ^/path/test$> <Directory ~ ^/path/test/$> <Directory ~ /path/test/$>
但是我发现,如果你省略EOL锚点( $ ),那么它匹配:
<DirectoryMatch ^/path/test/> <Files "test.html"> ExpiresActive on ExpiresDefault A10 </Files> </Directory>
然而,这当然与所有子目录中的test.html文件相匹配:
/path/test/test.html – 发送过期头文件 /path/test/noheader-test.html – 没有过期头发送 /path/test/child/test.html – 发送过期头文件 /path/test/child/grandchild/test.html – 发送过期头文件 就好像path中还有别的东西是正则expression式不匹配的,因为当我把正则expression式改成^/your/path/test/.+$它就匹配了。
想知道这个缺less的部分是什么,我用正则expression式捕获组和Header指令让Apache告诉我什么是缺less的,如下所示:
<DirectoryMatch ^/path/test/(?<MISSINGPART>.+)$> <Files "test.html"> Header add X-TEST "expr=%{env:MATCH_MISSINGPART}" </Files> </DirectoryMatch>
这给了以下标题:
/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 bug跟踪器bug 41867有些适合这个描述,所以可以解释这一点(我也testing了这个没有嵌套的<Files>指令和头值保持不变)
所以为了certificate它,我尝试用如下replacetest.html到正则expression式:
<DirectoryMatch "^/path/test/test.html$"> <Files "test.html"> Header add X-TEST "Match" </Files> </DirectoryMatch>
没有X-TEST标题被返回。
然而,这意味着正则expression式可以用来匹配我们感兴趣匹配的目录之后不是目录的东西,就像这样:
<DirectoryMatch "^/path/test/[^/]+$"> <Files "test.html"> ExpiresActive on ExpiresDefault A10 </Files> </DirectoryMatch>
这在所有希望的地方给了标题:
/path/test/test.html – 发送过期头文件 /path/test/noheader-test.html – 没有过期头发送 /path/test/child/test.html – 没有过期头发送 /path/test/child/grandchild/test.html – 没有过期头发送