阻止直接访问PHP脚本

阻止直接访问PHP脚本,php,Php,我修改了.htaccess以删除.php扩展名 下面的代码是我用| |$parts['filename']修改的,不允许直接访问。我的目标是阻止直接访问/page.php或/page,但它不起作用 /***************DO NOT ALLOW DIRECT ACCESS************************************/ $parts = pathinfo(__FILE__); if ( stripos( $_SERVER[ 'REQUEST_URI' ], (

我修改了.htaccess以删除
.php
扩展名

下面的代码是我用
| |$parts['filename']
修改的,不允许直接访问。我的目标是阻止直接访问
/page.php
/page
,但它不起作用

/***************DO NOT ALLOW DIRECT ACCESS************************************/
$parts = pathinfo(__FILE__);
if ( stripos( $_SERVER[ 'REQUEST_URI' ], (basename( __FILE__ ) || $parts['filename'] )) !== FALSE ) { 
    header("Location: ./"); 
  die();
}
mod之前的代码阻止访问/page.php,但允许访问/page(我不希望这样)


如何阻止对
/page.php
/page
的访问?

如果您不想访问页面,请执行以下操作:

if(!defined("IN_SCRIPT")) die();
确保在包含该文件的每个脚本中定义IN_脚本

phpBB等软件也使用这种方法

在您的索引中放置

session_start();
$_SESSION['logged'] = "OK";
然后在要验证的每个其他文件上包括

session_start();
$login = isset($_SESSION["logged"]) ? $_SESSION["logged"] : false;
if($login != "OK"){
  header("Location: path/to/your/index");
  exit;    
}

要能够包含来自其他脚本的文件,但不允许通过apache直接提供服务,请执行以下操作:

在要阻止直接访问的任何php文件的顶部:

<? __FILE__ != $_SERVER['SCRIPT_FILENAME'] || die('no direct access' );
test.php 加载/test-inc.php和/test-inc的输出
您可以将page.php移到公共根目录之外吗?而只需使用代码即可。如果确实要从.php文件执行此操作,请检查是否有正确的
$\u服务器['HTTP\u REFERER']
。它将保存用户来自的URL。如果它是空的或与站点的URL不同,那么它是“直接访问”,正如您所说:)因此,您希望能够包含来自另一个脚本的文件,但不希望文件本身能够通过web服务器提供服务?在我看来,这听起来是一个非常难以维护的解决方案。为什么不纠正htaccess规则,这样既不能访问page.php,也不能访问page。然后所有逻辑都在一个位置。他想阻止对目录的访问,而不是.phpfile@thelolcat你说它无法维护,但实际上很多脚本已经使用了这种技术。这是一个糟糕的解决方案,他想阻止访问“文件夹”而不是文件。@user2854563:不,他没有。他使用了mod_rewrite,因此可以在没有.php扩展名的情况下访问该文件。@user2854563他没有!引用他的话!为什么会被否决?使用会话实际上对OP的caseSession有效,在使用会话之前必须先启动会话。没有任何迹象表明第二个脚本必须包含在第一个脚本中,这样函数就不会被调用twice@onetrickponyOP的代码试图根据文件名阻止该文件,因此除了包含脚本外,没有其他方法可以运行脚本。
<? __FILE__ != $_SERVER['SCRIPT_FILENAME'] || die('no direct access' );
RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php
<?

header( 'content-type: text/plain');

var_dump( __FILE__ == $_SERVER['SCRIPT_FILENAME'] );

include 'test-inc.php';
<? __FILE__ != $_SERVER['SCRIPT_FILENAME'] || die('no direct access' );

var_dump( __FILE__ == $_SERVER['SCRIPT_FILENAME'] );
bool(true)
bool(false)
no direct access