检测Ajax调用的URL

9
我可以帮您翻译成中文。以下是需要翻译的内容:

我有一个HTML文档,通过AJAX调用从PHP文件加载内容。我的代码中重要的部分如下:

default.html:

/*more code above*/
var PHP_URL = "content.php";
var Content = document.getElementById('Content');
ajaxRequest = new XMLHttpRequest();
ajaxRequest.onreadystatechange =
    function() {
        if(ajaxRequest.readyState==4) {
            if (ajaxRequest.status==200)
                Content.innerHTML = ajaxRequest.responseText;
            else
                Content.innerHTML = "Error:<br/>unable to load page at <b>"+PHP_URL+"</b>";
            Content.className = "Content Solid";
        }
    }
ajaxRequest.open("GET",PHP_URL,true);
ajaxRequest.send();
/*more code below*/

在 'content.php' 文件中,是否有可能检测到它是被 'default.html' 或其他调用文档所调用的?

4个回答

13

大多数著名的Ajax框架,如jQuery和mooTools,会添加一个特定的头信息,你可以用PHP来检查:

if (strcasecmp('XMLHttpRequest', $_SERVER['HTTP_X_REQUESTED_WITH']) === 0)
{
    // Ajax Request
}

2
我想最好的方法是在您的AJAX调用中设置请求头,例如:
st.setRequestHeader('X-Sent-From','default.html')

然后在content.php文件中,

$sentFrom=$_SERVER['HTTP_X_SENT_FROM']; // outputs default.html

没想到 - 在 jQuery 中,您会使用 beforeSend 回调来完成此操作,还是有更简单的方法? - Jamie Wong
我经常使用jQuery,但不用于AJAX调用。然而,据我所知,我会使用beforeSend。 - fabjoa

1

1
你不能总是依赖于HTTP_REFERER字段被填充。 - Sjoerd
同意 - 但我能想到的唯一其他选择是生成一个存储在会话中的唯一哈希,并将其包含在AJAX请求中,然后检查用户的会话以查看它来自哪里。这有点丑陋,可能过度了。 - Jamie Wong

0

在服务器上,无法简单地检测请求是否来自 AJAX 调用。但是,您可以通过在 AJAX 请求时添加一个参数来指示它来自 AJAX 调用。

例如:

/*more code above*/
var PHP_URL = "content.php?mode=AJAX";
var Content = document.getElementById('Content');
ajaxRequest = new XMLHttpRequest();
ajaxRequest.onreadystatechange =
    function() {
        if(ajaxRequest.readyState==4) {
            if (ajaxRequest.status==200)
                Content.innerHTML = ajaxRequest.responseText;
            else
                Content.innerHTML = "Error:<br/>unable to load page at <b>"+PHP_URL+"</b>";
            Content.className = "Content Solid";
        }
    }
ajaxRequest.open("GET",PHP_URL,true);
ajaxRequest.send();
/*more code below*/

如果只是检测调用是否来自default.html(而不区分AJAX调用或点击链接),那么检查引荐头部就可以解决问题,正如@Jamie Wong所建议的那样。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接