【问题标题】:Deny access to php files but allow some other php files in subdirectory拒绝访问 php 文件,但允许子目录中的一些其他 php 文件
【发布时间】:2012-09-02 02:27:19
【问题描述】:

我有一个名为“模板”的目录。有些 php 文件我不希望人们直接访问它们,所以我在 htaccess 中写了这个:

<Files *.php>
    Order Deny,Allow
    Deny from all
</Files>

还有一些文件我希望人们可以直接访问它们,这些文件被命名为:

switcher.php、switcher1.php、switcher2.php、switcher3.php、switcher4.php、switcher5.php

位于template/styles/theme/

所以我在那个位置创建了一个新的 htaccess 文件并写了这个:

<FilesMatch "^switcher[1-5]?\.php$">
    Order Allow,Deny
    Allow from all
</FilesMatch>

这在我的本地主机上运行良好,但是当我在 cPanel 共享主机上上传脚本时,它在那里不起作用。拒绝访问所有 php 文件。

我可以做些什么来解决这个问题?

我不能要求主机进行更改,因为这个脚本应该安装在至少 30 台不同配置的共享主机上!

【问题讨论】:

  • 不要这样做。如果您不想允许访问某些文件,则根本不要将它们放入文档根目录。无法访问不存在的内容...当然,由于 PHP 不受网络服务器对文件访问的限制,它仍然可以包含/要求所有它想要的文件 - 您只需要在包含/需要指令。

标签: php apache .htaccess subdirectory


【解决方案1】:

检查每个文件中的REQUEST_URI

$file = basename(__FILE__);
if(preg_match("/$file/", $_SERVER['REQUEST_URI'])){
    die('This file cannot be accessed directly!');
}

【讨论】:

    【解决方案2】:

    如果您有一个包含 PHP 包含的目录,并且您不希望直接从浏览器访问,则可以使用 Mod_Rewrite 禁用该目录。

    要启用此功能,请按照主要说明和指导创建一个.htaccess 文件,并包含以下文本:

    ## Enable Mod Rewrite, this is only required once in each .htaccess file
    RewriteEngine On
    RewriteBase /
    ## Test for access to includes directory
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /includes/ .*$ [NC]
    ## Test that file requested has php extension
    RewriteCond %{REQUEST_FILENAME} ^.+\.php$
    ## Forbid Access
    RewriteRule .* - [F,NS,L]
    

    /includes/ 是您的包含目录。

    注意:我强烈建议将您不想被用户直接访问的文件存储在单独的目录/文件夹中。不用担心,您可以使用include 方法访问这些文件。

    【讨论】:

    • 我要拒绝php直接访问的目录,是一个模板目录,里面有一些switcher文件需要用户访问。
    • 您可以将安全文件保存在那里的子文件夹中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    • 2011-12-12
    • 2015-07-09
    • 2020-07-10
    • 2017-10-22
    • 1970-01-01
    相关资源
    最近更新 更多