我正在使用类似于下面的.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文件,我不希望将.htaccess规则放在特定的.php文件所在的文件夹中,所以我一直试图用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/在/home/hostaccount/public_html/位置尝试过。
我已经尝试将^添加到位置的开始,并在最后以$结束。
任何人都知道我在做什么错,更重要的是如何解决它?
在<FilesMatch "..."> <Files ~ "...">或<FilesMatch "..."> (或上下文中的<Files "..."> )之间没有太大区别,因为它们只是匹配文件基本名称,不包括目录path。
所以,如果文件的基本名在这个目录树中是唯一的 ,那么你可以简单地做:
<Files "file-to-allow.php"> Allow from all </Files>
但是,如果在多个目录中出现相同的文件基本名称,则这将在该目录树中的任何位置匹配file-to-allow.php 。
如果您需要匹配完整的文件系统path(或严格来说是URLpath),而不在目标子目录中使用.htaccess文件,并且无法访问服务器configuration(这将允许您使用<Directory>容器),那么你可以在mod_setenvif的帮助下做如下的事情:
SetEnvIf Request_URI "^/path/to/file-to-allow\.php$" letmein Allow from env=letmein
如果Request_URI匹配特定的URL(正则expression式),则SetEnvIf指令设置环境variablesletmein 。 然后在下面的Allow指令中使用它,只有在设置了环境variables的情况下才允许 。