2011-01-06 180 views
11

我有一个PHP文件,继承(包括)另一个PHP文件。所有继承的文件都位于一个名为“includes”的文件夹中。我希望能够限制对此文件夹的任何直接访问。只有服务器中的PHP文件可以与“includes”文件夹中的文件进行通信。我如何使用.htaccess来实现这样的目标?.htaccess限制访问文件夹

仅供参考,我用下面的代码,并没有奏效

Order deny,allow 
deny from all 

任何帮助将在您的理解

+0

如果这不起作用,可能是因为httpd.conf中设置为不读.htaccess文件。例如: <目录 “/路径/到/ webfiles”> 的AllowOverride无 切换到别的东西(例如设置AllowOverride所有),并重新启动Web服务器。 – user535673 2013-04-29 10:01:09

回答

19

如果你不具备实际移动选项“包括”文档根区域以外的文件夹,并使用包含路径(即你无法从网上得到它),然后输入

deny from all 

在该目录中的.htaccess目录中。

但是,替代方法是使用DEFINES指令仅允许通过特定授权文件访问这些包含程序。例如,把

<?php defined('ACCESS_ALLOWED') or die('Restricted Access'); ?> 

在包含文件的顶部,然后把

<?php define('ACCESS_ALLOWED', 1); ?> 

在被允许包含这些文件的程序。

这将防止包含文件的偶然GET运行它们,并且适用于任何Web服务器,而不仅仅是那些支持htaccess文件的服务器。

3

包括/的.htaccess:

Order deny,allow 
deny from all 
+0

试过但没有工作 – 2011-01-06 00:13:51

2

可以真正地使用index.php并使用header()传递404标头:

header('HTTP/1.1 404 Not Found', 404); 

IMO,这比403好,因为它就像文件夹不存在。而对于包括文件,把这个线以上第一include/require行的主要文件:

define('INCLUDED', true); 

而就在包括目录中的所有文件,把这个在最上面的部分。

if (!defined(INCLUDED)) { 
    header('HTTP/1.1 404 Not Found', 404); 
} 
+2

您可能还想调用exit();在标题之后,因为页面仍然可以执行。 – 2012-10-31 22:55:38

0

根据设定在更高层次上其他可能的选项,你可能需要使用:

Satisfy all 
Order deny,allow 
Deny from all 

我就遇到了这个当上目录中定义的基本认证,包括该行:

Satisfy any 

这正在阻止我的否认从所有人的生效,因为用户被认证。

1

您可以在htaccess或服务器中使用以下指令拒绝直接访问该文件夹。配置CONTEX:

MOD-别名基础的解决方案

Redirect 403 ^/folder/.+$ 

这将重定向所有文件和/文件夹/ 403禁止错误页面的显示目录。

国防部重写基础的解决方案:

RewriteEngine on 

RewriteRule ^/?folder/.+$ - [F]