【问题标题】:How to detect if file is being accessed or requested?如何检测文件是否被访问或请求?
【发布时间】:2010-09-12 21:17:27
【问题描述】:

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

例如,如果用户访问

/site/page.php

他应该被重定向到

/index.php?view=page

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

我该怎么做?

【问题讨论】:

  • 您是否在为您的 Ajax 调用使用框架?如果有,是哪一个? jQuery 和其他一些发送一个特殊的标头。
  • 等等,你的问题是什么。它是检测 Ajax 调用,还是检测访问的 URL?我不明白。
  • 用户无法访问/site/page.php,但他可以访问/index.php?v=page,后者会调用该网址并获取其内容

标签: php jquery ajax


【解决方案1】:

编辑:如果您想确定脚本是否是通过 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
}

【讨论】:

  • 我不认为这就是 OP 的意思。 (虽然我不确定 什么 OP 的意思。)
  • 在您的第二个回答中,访问页面和拨打电话均返回 true。
  • debug_backtrace 返回一个空数组。
  • @Bruno 我已经编辑了我的答案,但我仍然不确定这是否是你想要的。也许你应该写一个更清楚的问题。
【解决方案2】:

“它不应该做任何特别的事情”是指它不应该重定向吗?

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

回答:你不能。 Artefacto 提到了 HTTP_X_REQUESTED_WITH 标头 - 当然,但这可以伪造。

用户直接访问网址真的那么糟糕吗? 如果答案是“天哪!”那么系统的设计方式可能有问题。 重新设计它,直到答案是“实际上,我想它不会真的很痛。”

【讨论】:

  • 在这种情况下,是否可以伪造并不重要。页面重定向很重要,因为搜索引擎无法正常工作。
  • 搜索引擎?我不明白。您不希望此页面出现在搜索引擎中吗?如果此页面仅从 Javascript AJAX 调用链接,则搜索引擎机器人将永远找不到它,也永远不会访问它。如果您真的很担心链接会泄漏,请在其上放置一个 X-Robots-Tag http 标头。 googleblog.blogspot.com/2007/07/…
【解决方案3】:

如果您真的不希望有人访问 /site/page.php,您应该考虑将 /site/page.php 移到您的 Web 根目录之外。然后根据需要让您的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();
}
?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 2012-04-15
    • 2020-04-21
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    相关资源
    最近更新 更多