A有一个网页,其中的“ subdir” 具有以下结构:
index.php在/ system中调用file1.php。然后/ system中的其他文件被“提交”调用。 我无法编写正确的 .htaccess 来阻止直接通过其URL调用这些 / system / 。
我用Google搜索并尝试了各种 .htaccess 内容。但是大部分“ subdir” 根本无法访问(甚至不能从 index.php 访问),或者“网页” 访问返回< strong>“ 404” 。
通常,用户应打开 index.php 并决定要执行的操作。因此,他被重定向到相应的 / system / .php。 任何其他尝试/例如添加https://mywebpage/subdir/system/ anyfile 。应该将他重定向回index.php或其他任何“错误页面”。
答案 0 :(得分:2)
典型的方法是在入口点(如index.php)中定义一个先于其他文件运行的全局常量,然后检查每个文件中是否定义了该常量
define('SOME_CONST', true);
然后在每个文件的顶部
if(!defined('SOME_CONST')) die ("No direct access");
因此在不首先加载定义常量的文件的情况下访问文件会导致PHP终止。
这个“常量”可以是任何东西,通常我使用相对于index.php文件等的基本路径。
define('MY_BASE_PATH', __DIR__.'/');
依此类推...
需要记住的几件事
我应该提一下,您不应该在文件中定义它,而应该将其包含在其他文件中,那样就行不通了。
//DO NOT DO THIS as IT wont WORK!!!!! - technically it never fails
//--- in the file somefile.php ---
//required file defines SOME_CONST
require 'index.php';
//define('SOME_CONST', true); -- defined in index.php, think of it like copy and pasting that files code at this spot.
//will never fail, because it's defined by the file included/required above
if(!defined('SOME_CONST')) die ("No direct access");
这就像将其放入您的代码中并期望它会失败(显然,这里永远不会失败):
//dont do this either
define('SOME_CONST', true);
if(!defined('SOME_CONST')) die ("No direct access");
相反,请这样做:
因此,您必须包括来自该入口点的文件,并使用诸如路由器之类的东西……基本的MVC。改为这样做(大大简化了)
// --- in index.php ---
define('SOME_CONST', true);
require 'somepage.php';
//if(!defined('SOME_CONST')) die ("No direct access"); included in the above require
然后
//--- in somefile.php ---
if(!defined('SOME_CONST')) die ("No direct access"); //will fail if index.php is not loaded.
因此,如果有人只去somefile.php
,则该常量未定义。因为index.php
尚未在该文件“之前”执行。...如果您在检查之前包括index.php
(在somefile.php
中,则不喜欢。您显然不能在检查后包括它(index.php
)。因此它必须在somefile.php
之前运行,而不是仅加载somefile.php
时运行。这就是为什么您不能在index.php
中包含somefile.php
,而必须在somefile.php
中包含index.php
的原因。
显然,您将需要多于一页的somefile.php
。因此,在索引中,您将需要一种将请求定向到正确页面的方法。这称为路由。这是另一个主题...
我试图使它尽可能基本。真的很简单。
享受。