3

这本质上是这个问题的重复,但有一个警告:我想拒绝直接访问根目录下名为 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$"是行不通的。

4

3 回答 3

2

你不能单独使用<FilesMatchor<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(...))技巧更好,取决于你。

于 2012-11-06T15:00:31.970 回答
0

演示

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

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

于 2012-11-06T13:09:23.963 回答
0

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

大多数流行的网络应用程序这样做的方式是,他们在某处定义一个常量,然后在每个他们不想直接调用的文件中添加一个对该常量的检查:

在可以直接调用的主文件中,包括其他 index.php 文件,执行:

define ("CAN_RUN", true);

在您不想直接调用的每个子文件中:

if (!defined("CAN_RUN")) die ("This file can't be called directly.");
于 2012-11-06T13:09:26.390 回答