2012-11-06 154 views
3

这实质上是this question的重复,但有一点需要注意:我想拒绝直接访问根目录下所有名为index.php的文件。拒绝访问除根目录以外的所有.php文件index.php

允许: 的index.php

拒绝: /application/views/settings/index.php

我知道我可以使用PHP来寻找定义的常量或变量,但它是只有使用.htaccess才能实现这一点?这是我到目前为止有:

## 
# Disallow direct access to files. 
# 

<FilesMatch "^(.*)\.php$"> 
    Order Deny,Allow 
    Deny from all 
</FilesMatch> 

<FilesMatch "^index\.php$"> 
    Order Allow,Deny 
    Allow from all 
</FilesMatch> 

添加第三个FilesMatch否认"^(.*)/index/index\.php$"不起作用。

+0

你为什么要这样做?可能有更好的方法来实现你想要的。 –

+0

这是一个MVC应用程序。所有的控制器在'/ application/views'中都有一个对应的目录,默认视图总是被命名为“index”。 这不是什么大问题 - 我总是可以将它命名为“默认”或其他内容 - 但我只想知道是否可以通过.htaccess进行此操作。 – josocblaugrana

+1

所以你想防止直接调用index.php?大多数框架这样做的方式是,他们在某个地方定义一个常量,然后在每个他们不想直接调用的文件中添加一个检查常量:'if(!defined(“CAN_RUN”))die(“This file can'不要直接打电话。“);' –

回答

2

你不能用012做或<Files>单独指令:您需要将它们与<Directory结合使用。例如:

<Directory /var/www> 
    <FilesMatch "\.php$"> 
    Order Deny,Allow 
    Deny from all 
    </FilesMatch> 
    <FilesMatch "^index\.php$"> 
    Order Allow,Deny 
    Allow from all 
    </FilesMatch> 
</Directory> 

<Directory /var/www/*> 
    <FilesMatch "\.php$"> 
    Order Deny,Allow 
    Deny from all 
    </FilesMatch> 
</Directory> 

这里的缺点是,你应该修改httpd.conf或类似的文件,如<Directory>指令不能.htaccess使用。

如果你不能更新.conf文件和.htaccess是唯一的解决方法,你将不得不复制每个目录的.htaccess显示的规则,我想。是否比使用if(defined(...))技巧更好,取决于你。

0

DEMO

(?<![^\/])\/index\.php

快速正则表达式,你可能想要的东西更准确。

0

所以你想防止index.php被直接调用?

的方式最流行的网络应用程序做到这一点,他们定义了一个恒定的某处,然后再添加一个检查中的每个文件是恒定的,他们不想直接调用:

在主文件,它可以被称为直接,包括其他的index.php文件,这样做:

define ("CAN_RUN", true); 

在每一个子文件,您不想直接调用:

if (!defined("CAN_RUN")) die ("This file can't be called directly."); 
+0

大多数框架不是将应用程序文件与公共脚本分开(因此前者无法从'/ public'目录访问)? – raina77ow

+0

@ raina77ow这确实是最好的方式去尽可能。我的意思是说最受欢迎的*网络应用程序*像WP,其中大多数没有这种分离 - 至少不正确。 –

相关问题