阻止访问子目录中的所有 php 文件

阻止访问子目录中的所有 php 文件

我需要阻止对我的 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

相关内容