Php 如何正确使用和定义!定义为保护页面不被直接访问?

Php 如何正确使用和定义!定义为保护页面不被直接访问?,php,Php,我试图保护php文件不被直接访问。我在config.php中定义了“TESTCONST”常量。在其他文件中,我检查它是否定义为: if(!defined('TESTCONST')) { header('Location: /'); } 但是如果我在上面包含config.php,这将不起作用,因为它总是被定义的。那么,我如何用define实现这一点呢!定义这里有一点结构: config.php: <?php define('TESTCONST', true);

我试图保护php文件不被直接访问。我在config.php中定义了“TESTCONST”常量。在其他文件中,我检查它是否定义为:

if(!defined('TESTCONST')) { header('Location: /'); }
但是如果我在上面包含config.php,这将不起作用,因为它总是被定义的。那么,我如何用define实现这一点呢!定义这里有一点结构:

config.php:

    <?php

    define('TESTCONST', true);

    .*.. A lot of other configs ...*

如果您试图阻止web访问某些php文件,那么最好的方法就是拒绝服务器的访问。对于apache,可以使用.htaccess文件
将您的文件设置为:

/index.php
/protected/.htaccess
/protected/sensitive_script.php
/protected/not_not_access.php
在.htaccess中

Deny from all
第一种方法:使用
config.php
在每个允许直接访问的PHP脚本中,都需要它:

require_once $_SERVER['DOCUMENT_ROOT'] . '/core/configs/config.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/core/configs/config.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/core/configs/access.php';
在每个要防止直接访问的PHP脚本中,检查常量:

if(!defined('TESTCONST')) { header('Location: /'); }
require_once $_SERVER['DOCUMENT_ROOT'] . '/core/configs/config.php';
if(!defined('TESTCONST')) { header('Location: /'); }
(如果已定义,
config.php
已经是必需的,因此不需要
require\u once

第二种方法:使用另一个脚本文件 为常量的定义创建另一个PHP文件(在这里,我们称它为
access.PHP

在每个要防止直接访问的PHP脚本中,检查常量:

if(!defined('TESTCONST')) { header('Location: /'); }
require_once $_SERVER['DOCUMENT_ROOT'] . '/core/configs/config.php';
if(!defined('TESTCONST')) { header('Location: /'); }

但是如果我在上面包含config.php,这将不起作用,因为它将始终被定义。-您可以使用
defined
来确保文件没有被更改,如果文件被更改了,您可以阻止执行,因为配置不正确。即使没有更改,也可能会执行。因此检查很重要。那么使用此组合的正确方法是什么:定义和!定义&定义正确的方法。只需删除要求。如果它还没有被导入,
TESTCONST
将不会被定义,因此您可以重定向,正如预期的那样,如果
TESTCONST
被定义(因此您的脚本没有被直接调用),那么
config.php
已经被另一个脚本导入,因此不需要它。好吧,大多数php文件都是独立的,由JQuery POST调用。我的意思是,这个php文件不包括或不需要。所以他们需要导入config.php。。我想你明白我的意思。我的错误他说了“我正试图保护php文件不受直接访问”。也许他需要更好地解释我的错误,而不是你的错误,他可能正在尝试,我不太清楚。这里的问题是,这根本不是控制脚本访问的好方法。我同意。但OP询问如何以这种方式进行。有很多更好的方法可以做到这一点,但它们都离题了。也许他不能访问NGinX/Apache/其他配置文件,也许他被要求这样做。他们怎么会偏离主题呢?建议的一个更好的选择永远不会偏离主题,只要它是合理的。我为什么要使用define!定义我看到很多CMS都使用了这种技术。@Script47因为当有人问
如何使用a?
而你回答
时,你必须使用B
,这不是他要求的。