通过 htaccess 拒绝直接访问文件夹和文件

情况是这样的:

  • 根文件夹中有一个 index.php文件
  • 一些文件包含在 index.php中,它们在 includes文件夹中。
  • 另一个文件(submit.php)位于表单提交操作的根文件夹中。

我想限制直接用户访问的文件在 includes文件夹的 htaccess。同样适用于 submit.php。但是 include 将为 index.php文件工作。 类似地,如果用户键入 www.domain.com/includes/somepage.php,它将限制它(可能会重定向到错误页面)。

307549 次浏览

我只需要把 includes文件夹移出 web-root,但是如果你想阻止直接访问整个 includes文件夹,你可以把一个 .htaccess文件放在那个文件夹中,它包含:

deny from all

这样,您就不能打开该文件夹中的任何文件,但是可以将它们包含在 php 中而不会出现任何问题。

如果我理解正确,您只是想拒绝访问包含文件夹?

在 include 文件夹中放置一个带有“ DENY FROM ALL”指令的. htaccess 就可以了。

这是纯基于 mod_rewrite的解决方案:

RewriteRule ^(includes/|submit\.php) - [F,L,NC]

如果 URI 包含 /includes//submit.php,这将显示禁止使用的错误

您的问题分为两部分,Jeroen 和 anubhava 的解决方案都适用于第一部分——拒绝访问/包含。阿努巴娃也为第二部分工作。我更喜欢后者,因为我使用 DOCROOT/.htaccess无论如何,这保持所有这样的控制在一个文件。

然而,我想要讨论的是“拒绝访问 submit.php”的概念。如果您不想使用 submit.php,那么为什么要在 DOCROOT 中使用它呢?我怀疑这里的答案是,您在某些表单中使用它作为操作目标,并且只希望在表单提交时触发它,而不是直接触发,例如从垃圾邮件程序。

如果这是真的,那么你不能使用阿努巴娃的第二部分,因为这将导致你的形式失败。 你可以在这里做的是(i)与 .htaccess检查,以确保引用是您自己的索引页:

RewriteCond %{HTTP_REFERRER} !=HTTP://www.domain.com/index.php   [NC]
RewriteRule ^submit\.php$    -                                   [F]

(ii)在 PHP index.PHP 表单生成器中包含一些用于时间戳和验证的隐藏字段。验证可以是,比如说,时间戳 MD5的前10个字符和一些内部秘密。在处理提交时,您可以(i)验证时间戳和验证匹配,以及(ii)时间戳在当前时间的15分钟内。

这可以防止垃圾邮件,因为垃圾邮件制造者获得有效时间戳/验证对的唯一实用方法就是解析表单,但是这个刮片只有15分钟的生命周期。

根据在较高级别设置的其他可能选项,您可能需要将以下内容放入。Htaccess 文件在您的包括目录:

Satisfy all
Order deny,allow
Deny from all

当上层目录定义基本身份验证时,我遇到了这个问题,包括下面这行:

Satisfy any

这阻止了我的拒绝全部生效,因为用户是经过身份验证的。

可以使用 Files 指令禁止访问所有文件,然后再次使用它来设置可访问的文件:

<Files ~ "^.*">
Deny from all
</Files>


<Files ~ "^index\.php|css|js|.*\.png|.*\.jpg|.*\.gif">
Allow from all
</Files>

基于 mod _ alias 的1行程序解决方案:

RedirectMatch 403 ^/folder/file.php$

这将显示/file/file.php 的禁止错误

您可以将以下命令添加到 .htaccess文件中

Deny from all
ErrorDocument 403 "nothing is here"

在未经授权访问的情况下,它将显示“ Nothing is here”消息。

如果您想通过错误代码重定向到某个页面,那么您可以定义如下命令:

ErrorDocument 404 "/errors/404.html"

它将重定向到 /errors/404.html并显示自定义页面未找到屏幕。