如何阻止对根文件夹中除 index.php 之外的所有 .php 的访问(通过 .htaccess)?

Posted

技术标签:

【中文标题】如何阻止对根文件夹中除 index.php 之外的所有 .php 的访问(通过 .htaccess)?【英文标题】:How to block access to all .php except index.php in root folder (via .htaccess)? 【发布时间】:2014-01-08 18:27:49 【问题描述】:

注意:这个问题已经被问过好几次了,但答案真的很糟糕,完全错误和/或不符合上述情况(因为有几个文件名为 index.php) .如果您愿意,请参阅 [1]。

我想阻止通过根文件夹中的 .htaccess 文件直接访问 application 文件夹中的所有 .php 文件(参见文件结构图)。网上有一些解决方案,但他们漏掉了一件事:如果有多个名为 index.php 的文件(这是一个真实的场景,如屏幕截图所示,查看 view/xxx/ 文件夹中的文件):

问题:如何阻止对所有.php文件的访问,除了根文件夹中的index.php?

【问题讨论】:

很抱歉,如果您尝试过此操作,但您是否尝试过将所有内容移出文档根目录并让 index.php 引用这些文件? 【参考方案1】:

在 .htaccess 中:

RewriteEngine on
RewriteRule ^/application - [F]

[F] 选项指示它对所有匹配的 URL 发出 403 Forbidden 响应。

或者在 /application 中添加一个单独的 .htaccess 文件,其中仅包含:

deny from all

或者在您的 Apache vhost 定义中:

<Location /application>
  deny from all
</Location>

【讨论】:

这对我不起作用?这对任何人都有效吗?子目录中的 index.php 仍然可以访问。【参考方案2】:

除了 Niels Keurentjes excellent answer 我想根据我的 .htacces 扩展他的解决方案,它使用一些非常常见的重写模式(因为很多人可能会遇到同样的问题) :

使用 URL 重写规则时,RewriteRule ^/application - [F] 行必须恰好在那个位置。如果将线放在之前或下​​方,它将不起作用:

RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-l

# The new line, blocking direct access to every file in /application and deeper
RewriteRule ^/application - [F]

RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]

【讨论】:

嗯,这似乎不像我想的那样工作......它还会阻止不在 application 文件夹中的文件。

以上是关于如何阻止对根文件夹中除 index.php 之外的所有 .php 的访问(通过 .htaccess)?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除 Core Data 存储中除一个对象之外的所有对象?

如何与正则表达式匹配PHP中除“-”之外的所有特殊字符?

如何复制表中除应更改的单个列之外的所有数据

用于删除目录中除指定列表之外的所有文件夹的批处理文件

如何将逗号添加到字符串中除最后一项之外的所有内容

如何删除 Firebase 节点中除最近的 X 子节点之外的所有子节点?