我需要阻止对我的 Web 根目录子目录中所有 .php 文件的访问。我知道我可以在此子目录中创建 .htaccess 并使用以下内容:
<FilesMatch "\.(?i:php)$">
<IfModule !mod_authz_core.c>
Order allow,deny
Deny from all
</IfModule>
<IfModule mod_authz_core.c>
Require all denied
</IfModule>
</FilesMatch>
但是,为了透明度/简单性,我确实需要从 Web 根目录 .htaccess 进行阻止,而不是通过子目录中的阻止。
如果我要从根 .htaccess 阻止特定文件,我会使用以下命令:
<Location /wp-includes/somefile.php>
<IfModule !mod_authz_core.c>
Order allow,deny
Deny from all
</IfModule>
<IfModule mod_authz_core.c>
Require all denied
</IfModule>
</FilesMatch>
我读到过不能在 .htaccess 中使用 LocationMatches,那么有没有其他方法可以做到这一点(无需为子目录创建 .htaccess?
更新
看来<Location>
在 .htaccess 中也不能使用。
答案1
<Location>
(和)指令<LocationMatch>
与 URL 路径匹配,而不是严格地与文件系统路径匹配,因此不一定建议使用它来控制访问(在服务器配置中)。
如果您有权访问服务器配置,那么您只需使用相关的<Directory>
容器。
如果不需要在子目录中使用,.htaccess
您可以使用 mod_setenvif 根据请求的 URL 有条件地设置环境变量,然后根据此环境变量进行阻止。
例如:
SetEnvIf Request_URI "^/subdirectory/.+\.php$" BLOCK
<IfModule !mod_authz_core.c>
Order deny,allow
Deny from env=BLOCK
</IfModule>
<IfModule mod_authz_core.c>
<RequireAll>
Require all granted
Require not env BLOCK
</RequireAll>
</IfModule>
我撤销了该Order
指令(Apache 2.2),否则,如果没有附加Allow
指令,一切都会被阻止。
Apache 2.4 指令需要位于<RequireAll>
容器内,首先授予所有访问权限(否则一切被阻止),然后在BLOCK
设置环境变量时有条件地拒绝访问。您不能Require
在隐含<RequireAny>
容器中使用否定指令,因为它不会产生任何效果(事实上,这会导致 500 错误)。
请注意,这会阻止 URL,而不是严格意义上的“文件”。它会阻止看起来像.php
文件的请求/subdirectory
- 无论它们是否实际以物理文件形式存在。
或者,您可以在根文件的顶部使用 mod_rewrite(Apache 2.2 和 2.4).htaccess
:
RewriteEngine On
RewriteRule ^subdirectory/.+\.php$ - [F]
这只会阻止(403 Forbidden).php
请求中所有以 结尾的 URL /subdirectory
。如果您特别需要只对映射到真实文件的 URL 返回 403,那么您可以添加一个附加条件(尽管这可能不必要地浪费):
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^subdirectory/.+\.php$ - [F]
如果您想返回 404,请更改F
为。R=404