修改工作 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>
但是不幸的是,这条规则也允许在任何子目录中发生这种情况。
- /opensearch.xml, working/desired 匹配
- /henchman24/opensearch.xml,正在工作/不 需要匹配
我们如何强制 Apache 仅 匹配当前目录中的文件而不不 子目录?
我真的很想:
- 避免在每个可能的子目录中添加子
.htaccess
文件。
- 避免使用绝对服务器路径。
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 中的重写具有内置 属性,任何子目录中的那些文件名都将在正则表达式测试的字符串中存在子目录,因此锚定的正则表达式将不会在子目录中匹配。
下面的代码可以很好地允许 PHP 在两个 XML 文件上执行:
<FilesMatch ^(opensearch|sitemap)\.xml$>
AddHandler application/x-httpd-php5 .xml
</FilesMatch>
但是不幸的是,这条规则也允许在任何子目录中发生这种情况。
- /opensearch.xml, working/desired 匹配
- /henchman24/opensearch.xml,正在工作/不 需要匹配
我们如何强制 Apache 仅 匹配当前目录中的文件而不不 子目录?
我真的很想:
- 避免在每个可能的子目录中添加子
.htaccess
文件。 - 避免使用绝对服务器路径。
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 中的重写具有内置 属性,任何子目录中的那些文件名都将在正则表达式测试的字符串中存在子目录,因此锚定的正则表达式将不会在子目录中匹配。