执行脚本,但不允许用户访问它


Execute a script, but not let users access it

可能的重复项:
如何阻止PHP文件访问全局

对于我正在从事的项目,我需要("xxxx.php"(;将我网站的某些部分包含在我的网站中。

例如,我有标题.php而我的网站只是使用一个简单的require("header.php"(向全世界显示。

现在,我如何使页面包含标题.php的内容,但使用户无法通过以下方式访问它

http://mywebsite.com/header.php

将文件放在 Web 服务器的 DocumentRoot 之外的某个位置。

设置网络服务器,以便:

  1. 你有一个公共目录,你的可访问文件驻留在其中,比如静态媒体+索引.php等等

  2. 具有位于公用文件夹之外的资源目录。

  3. 将 Web 服务器设置为从公共目录提供服务

  4. 像这样包含:

    要求("../private/header.php"(;

您可以在

索引文件中定义一个常量,然后在header.php中检查该常量是否存在。

// check if the header.php file is accessed directly
if (!define('MY_SECRET_CONSTANT')) {
    exit();
}

您可以使用 htaccess 来确保不查看特殊文件。同样可以通过虚拟主机条目来实现。

最好的做法是创建一个/web 文件夹,它是应用程序的"根",并存储所有应该可访问的内容。其他文件夹位于其他任何位置,并包含在旨在由用户访问的脚本中。

您的结构可能如下所示:

/var/www/mySite/inc/header.php
/var/www/mySite/web/index.php (including ../inc/header.php)
/var/www/mySite/web/css/style.css

您的 apache 虚拟主机如下所示:

<VirtualHost *:80>
    ServerName www.mysite.com
    # Basic stuff
  DocumentRoot "/var/www/mySite/web"
    DirectoryIndex index.php
    <Directory "/var/www/mySite/web">
        AllowOverride All
        Allow from All
    </Directory>
</VirtualHost>

现在,无法通过您的域访问inc文件夹,因为您的Web文件夹是来自该URL的每个人的根目录。另一方面,您的脚本当然可以导航得更低,包括来自任何地方的脚本。

从答案中可以看出:有无数种方法可以做到这一点,这里有两个非常简单的方法,不需要您更改目录结构:

在包含header.phpindex.php和其他文件中:

define('INCLUDED', true);
require 'header.php';

header.php

if(!defined('INCLUDED')){
  die('Forbidden'); // or you could redirect to home ... whatever you want :)
}

或者,您可以通过 .htaccess 禁止访问。因此,您甚至不必触摸代码:

<Files header.php>
  order allow,deny
  deny from all
</Files>

如果您的包含全部位于一个目录中,则只需拒绝对该目录的访问即可。