.htaccess 拒绝/允许当前规则​​内的特定文件夹

.htaccess 拒绝/允许当前规则​​内的特定文件夹

我正在使用.htaccess与以下类似的规则:

# BEGIN Disable access to all files EXCEPT
Order deny,allow
Deny from all

# Files
<Files ~ ".(doc|xlsx|xlsm|xls|pdf|docx|txt|rtf|rdf|odf)$">
    Allow from all
</Files>
# Page Content
<Files ~ ".(css|js)$">
    Allow from all
</Files>
# Images
<Files ~ ".(jpe?g|png|gif|bmp|cur|ico|webp)$">
    Allow from all
</Files>
# Fonts
<Files ~ ".(svgz?|eot|otf|tt[cf]|woff2?)$">
    Allow from all
</Files>

但是,我还想允许一个特定的.php文件,我不想在特定.php文件所在的文件夹中放置 .htaccess 规则,因此我一直尝试使用FilesMatch

这里有些例子:

<FilesMatch "\/folder1\/folder2\/folder3\/folder4\/\.(php)">
    Allow from all
    Satisfy Any   
</FilesMatch>

<FilesMatch "\folder1\folder2\folder3\folder4\file1.php">
    Allow from all
    Satisfy Any   
</FilesMatch>

我甚至尝试过/home/hostaccount/public_html/在位置的开始处以及/public_html/位置的开始处使用它们。

我尝试在位置的开始处添加内容,并在结束处^完成它。$

有人知道我做错了什么以及更重要的是如何解决它吗?

答案1

<Files ~ "..."><FilesMatch "...">(或在这种情况下)之间没有太大区别,<Files "...">因为它们都只是与文件基名匹配,而不包括目录路径。

因此,如果文件的基本名称是独特的在此目录树中,您可以简单地执行以下操作:

<Files "file-to-allow.php">
    Allow from all
</Files>

然而这将匹配file-to-allow.php 任何地方在此目录树中,如果相同的文件基名出现在多个目录中。

如果您需要匹配完整的文件系统路径(或严格来说是 URL 路径),而不使用.htaccess目标子目录中的文件,也不访问服务器配置(这将允许您使用容器<Directory>),那么您可以在 mod_setenvif 的帮助下执行以下操作:

SetEnvIf Request_URI "^/path/to/file-to-allow\.php$" letmein

Allow from env=letmein

如果匹配特定的 URL(正则表达式),则该SetEnvIf指令会设置环境变量。然后在以下指令中使用它来仅letmeinRequest_URIAllow允许如果设置了环境变量。

相关内容