修改工作 AddHandler 以仅匹配当前目录中的文件,而不是子目录中的文件

Modify working AddHandler to match files only in the CURRENT directory, NOT child directories

下面的代码可以很好地允许 PHP 在两个 XML 文件上执行:

<FilesMatch ^(opensearch|sitemap)\.xml$>
AddHandler application/x-httpd-php5 .xml
</FilesMatch>

但是不幸的是,这条规则也允许在任何子目录中发生这种情况。

我们如何强制 Apache 匹配当前目录中的文件而不 子目录?

我真的很想:

If directive can be used to provide a condition 只为与当前文件夹中的模式匹配的文件添加处理程序。

以下示例将只为文档根目录中的文件添加处理程序,例如 /sitemap.xml/opensearch.xml 但不会为 /folder/sitemap.xml/folder/opensearch.xml

<FilesMatch ^(opensearch|sitemap)\.xml$>
<If "%{REQUEST_URI} =~ m#^\/(opensearch|sitemap)\.xml$#">
  AddHandler application/x-httpd-php .xml
</If>
</FilesMatch>

在上面的示例中,条件是检查 REQUEST_URI 是否与 m# # 中分隔的 regex pattern 匹配。 ~= comparison operator 检查字符串是否匹配正则表达式。

模式 ^\/(opensearch|sitemap)\.xml$ 匹配 REQUEST_URI variable(请求的 URI 的路径部分),例如 /opensearch.xml/sitemap.xml

^                      # startwith
\/                     # escaped forward-slash
(opensearch|sitemap)   # "opensearch" or "sitemap"
\.                     # .
xml                    # xml
$                      # endwith

你在 RewriteRule 中尝试过 H= 吗?

RewriteEngine On
RewriteRule ^(opensearch|sitemap)\.xml$ . [H=application/x-httpd-php5]

htaccess 中的重写具有内置 属性,任何子目录中的那些文件名都将在正则表达式测试的字符串中存在子目录,因此锚定的正则表达式将不会在子目录中匹配。