如何检测文件是否被访问或请求?

时间:2010-09-12 21:17:28

标签: php jquery ajax

我有一个PHP文件,如果用户直接访问它,他应该被重定向到另一个位置,但如果我的脚本通过ajax调用它,它应该没有什么特别的。

例如,如果用户访问

/site/page.php

他应该被重定向到

/index.php?view=page

但是如果他在index.php?view=page上,那么该文件应该在没有重定向的情况下加载。

我该怎么做?

3 个答案:

答案 0 :(得分:5)

编辑:如果您想确定是否通过Javascript请求了脚本,您必须以某种方式发出信号。

多个工具包定义标题X-Requested-With。在这种情况下,您可以通过以下方式检查Javascript调用:

if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&
        strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
    //requested with Javascript
}

您可以检查debug_backtrace给出的结果大小。

或者(更好),您可以查看$_SERVER['SCRIPT_FILENAME']

if (realpath(__FILE__) == realpath($_SERVER['SCRIPT_FILENAME'])) {
    //this one was requested; not in include
}

答案 1 :(得分:0)

通过“它应该没有什么特别的”你的意思是它不应该重定向吗?

所以Q真的是如果用户直接访问PHP文件的URL,它应该重定向,如果通过AJAX,正常处理? (要真正澄清,你的意思是通过URL,而不是通过包含声明,对吗?)

答案:你不能。 Artefacto提到了HTTP_X_REQUESTED_WITH标题 - 当然,但这可能是伪造的。

用户直接访问URL真的很糟糕吗? 如果答案是“OMG Yes!”那么系统的设计方式可能有问题。 重新设计它直到答案是“实际上,我认为它不会真的受伤。”

答案 2 :(得分:0)

如果您确实不希望有人访问/site/page.php,您应该考虑将/site/page.php移到网络根目录之外。然后根据需要让index.php加载它:

<?php 
$includes = "/path/to/includes";  // specified in a config file somewhere

if ($_GET["view"] == "page") {
    require_once(path_join($includes, "page.php")); 
    DoStuffInPageDotPHP();
}
else {
    DoSomethingElse();
}
?>