将Apache httpdconfiguration应用于精确文件和无子目录

我有一个问题,它应该是简单的。 我想将一组configuration指令应用于单个文件(本例中为DocumentRoot中的myfile.html )。 也可能有包含myfile.html子目录,这些不应该得到configuration。 我也想使用LocationLocationMatch

我想出了以下几点

 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.htmlx-test:"test.html"
  • /path/test/noheader-test.html – 没有发送头文件
  • /path/test/child/test.htmlx-test:"child/test.html"
  • /path/test/child/grandchild/test.htmlx-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 – 没有过期头发送