我有一个PHP文件,如果用户直接访问它,他应该被重定向到另一个位置,但是如果我的脚本通过ajax调用它,它应该没有什么特别的。如何检测是否正在访问或请求文件?
例如,如果用户访问
/site/page.php
他应该被重定向到
/index.php?view=page
但如果他是在index.php?view=page
文件应该没有重定向加载。
我该怎么做?
我有一个PHP文件,如果用户直接访问它,他应该被重定向到另一个位置,但是如果我的脚本通过ajax调用它,它应该没有什么特别的。如何检测是否正在访问或请求文件?
例如,如果用户访问
/site/page.php
他应该被重定向到
/index.php?view=page
但如果他是在index.php?view=page
文件应该没有重定向加载。
我该怎么做?
编辑:如果您想确定是否通过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
}
通过 “它应该做的没有什么特别的” 你的意思是它不应该重定向?
所以Q是真的如果用户直接访问PHP文件的URL,它应该重定向,如果通过AJAX,正常处理? (说真的,澄清,你的意思是通过一个URL,而不是通过包括声明,对吧?)
答:你不能。 Artefacto提到了HTTP_X_REQUESTED_WITH头 - 当然,但这可能是伪造的。
用户直接访问网址真的很糟糕吗? 如果答案是“OMG是!”那么系统的设计方式可能有问题。 重新设计它直到答案是“其实,我想它不会真的受伤。”
在这种情况下,它是否可以伪造并不重要。重要的是页面重定向,因为搜索引擎无法正常工作。 – BrunoLM 2010-09-12 21:51:24
搜索引擎?我不明白。你不希望这个网页出现在搜索引擎中?如果此页面仅通过Javascript AJAX调用进行链接,那么搜索引擎机器人将永远不会找到它并永远不会访问它。如果你真的很偏执,那么链接将会泄漏出去,把一个X-Robots-Tag http头放在它上面。 http://googleblog.blogspot.com/2007/07/robots-exclusion-protocol-now-with-even.html – James 2010-09-12 22:08:24
如果你真的不想让某人访问/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();
}
?>
您是否在为Ajax调用使用框架?如果是这样,哪一个? jQuery和其他一些人发送了一个特殊的头文件。 – 2010-09-12 21:21:42
等一下,你的问题是什么。它检测到Ajax调用,或者检测到访问的URL?我不明白。 – 2010-09-12 21:23:27
用户无法访问'/ site/page.php',但他可以访问'/index.php?v=page',它调用了该URL并获取其内容 – BrunoLM 2010-09-12 21:25:23