我设置了一个服务器,我希望可以通过浏览器读取特定的 PHP 文件,但我希望拒绝其余 PHP 文件的访问。所以我把它放在.htaccess
服务器根目录中:
<Files "*.php">
Require all denied
</Files>
然后,我将其放入子文件夹中(假设该文件夹是subdir
)以匹配特定文件:
<Files "folder/specific.php">
Require all granted
</Files>
但这不起作用。仅当我直接将其放入时才有效subdir/folder/specific.php
:
<Files "*.php">
Require all granted
</Files>
为什么会出现这样的情况呢?即使我使用:
Order Allow, Deny
Allow from all
同样的事情也会发生。
<Files>
指令预计不会有任何路径组件,只有基本文件名组件。指令的参数中不应有斜杠,并且*
不匹配斜杠(顺便说一句,因为它通常在系统 shell 中工作)。模块core
文档指出:显然,文件系统对象的基本名称(最后一个之后的内容
/
)不能匹配任何包含斜杠的内容。正如描述配置部分的页面中所建议的,为了匹配特定目录中的特定文件,您通常嵌套
<Files>
在相应的<Directory>
:这意味着将其写为单个
<Files "/var/web/dir1/private.html>
. 在你的情况下,我怀疑服务器应该在错误日志中的某个地方抱怨.htaccess
指令不正确。由于
.htaccess
不能包含<Directory>
节并且其本身对应于它所在的目录路径,这意味着将您的<Files>
节添加到.htaccess
放置在目标文件(或其任何父级)所在目录的同一目录中的文件中,并且不使用任何路径指令内。这正是你在“它只起作用”时所做的事情。另请注意,
.htaccess
文档 以以下内容开头:因此,它们提供的唯一好处是能够在不访问服务器配置的情况下更改服务器的某些配置。其他一切皆有可能;如果您有该访问权限(您当然有,否则这里的问题将偏离主题),您应该将您的配置转换
.haccess
为服务器内配置并禁用AllowOverride
,从而消除它产生的任何性能损失。有关如何执行此操作的详细信息在同一页面的与主配置文件合并.htaccess
子标题下提供。