可能的重复项:
如何阻止PHP文件访问全局
对于我正在从事的项目,我需要("xxxx.php"(;将我网站的某些部分包含在我的网站中。
例如,我有标题.php而我的网站只是使用一个简单的require("header.php"(向全世界显示。
现在,我如何使页面包含标题.php的内容,但使用户无法通过以下方式访问它
http://mywebsite.com/header.php
将文件放在 Web 服务器的 DocumentRoot 之外的某个位置。
设置网络服务器,以便:
-
你有一个公共目录,你的可访问文件驻留在其中,比如静态媒体+索引.php等等
-
具有位于公用文件夹之外的资源目录。
-
将 Web 服务器设置为从公共目录提供服务
-
像这样包含:
要求("../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.php
的index.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>
如果您的包含全部位于一个目录中,则只需拒绝对该目录的访问即可。