我有一个PHP文件,如果用户直接访问它,他应该被重定向到另一个位置,但如果我的脚本通过ajax调用它,它应该没有什么特别的。
例如,如果用户访问
/site/page.php
他应该被重定向到
/index.php?view=page
但是如果他在index.php?view=page
上,那么该文件应该在没有重定向的情况下加载。
我该怎么做?
答案 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();
}
?>