我正在使用.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
指令会设置环境变量。然后在以下指令中使用它来仅letmein
Request_URI
Allow
允许如果设置了环境变量。