【问题标题】:Deny access to all .php files except root index.php拒绝访问除根 index.php 之外的所有 .php 文件
【发布时间】:2012-10-26 10:24:18
【问题描述】:

这本质上是 this question 的副本,但有一个警告:我想拒绝直接访问根目录下名为 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$" 不起作用。

【问题讨论】:

  • 为什么要这样做?可能有更好的方法来实现您想要的。
  • 它用于 MVC 应用程序。所有控制器在/application/views 内都有一个对应的目录,默认视图总是被命名为“index”。这没什么大不了的——我总是可以将它命名为“默认”或其他名称——但我只想知道 .htaccess 是否可以做到这一点。
  • 所以你想防止 index.php 被直接调用?大多数框架这样做的方式是,他们在某处定义一个常量,然后在他们不想直接调用的每个文件中添加对该常量的检查:if (!defined("CAN_RUN")) die ("This file can't be called directly.");
  • 是的,我知道。我只是认为这可以单独使用 .htaccess 来完成,并在每个文件中保存几行代码。
  • 为了清楚起见,我倾向于把它放在 PHP 文件中。这是一个非常笨拙的 htaccess 规则;另外,如果您曾经使用与 Apache 不同的 Web 服务器,或者如果 Apache 未配置 AllowOverride All,它将无法工作。

标签: regex .htaccess


【解决方案1】:

DEMO

(?&lt;![^\/])\/index\.php

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

【讨论】:

    【解决方案2】:

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

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

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

    define ("CAN_RUN", true);
    

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

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

    【讨论】:

    • 大多数框架不是将应用程序文件与公共脚本分开(因此前者无法从/public 目录访问)吗?
    • @raina77ow 这确实是最好的方法。我的意思是说最流行的网络应用程序,比如 WP,其中大多数没有这种分离——至少没有正确分离。
    【解决方案3】:

    你不能单独使用 &lt;FilesMatch&lt;Files&gt; 指令:你需要将它们与 &lt;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 或类似文件,因为&lt;Directory&gt; 指令不能在.htaccess 中使用。

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

    【讨论】:

      猜你喜欢
      • 2010-11-23
      • 2011-12-15
      • 2011-03-25
      • 2015-09-13
      • 2020-01-13
      • 1970-01-01
      • 2013-12-21
      • 1970-01-01
      • 2014-01-08
      相关资源
      最近更新 更多