【问题标题】:Detect Ajax calling URL检测 Ajax 调用 URL
【发布时间】:2011-03-08 16:00:51
【问题描述】:

我有一个 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' 调用的,或者根据需要从不同的调用文档调用?

【问题讨论】:

    标签: php javascript html ajax


    【解决方案1】:

    大多数著名的 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 回调来执行此操作,还是有更简单的方法?
      • 我经常使用 jQUery,但不用于 AJAX 调用。然而,据我所知,我会使用 beforeSend
      【解决方案3】:

      不可能简单地检测到请求来自服务器上的 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 调用或点击的链接),那么检查 Referrer 标头就可以解决问题,正如@Jamie Wong 所建议的那样。

      【讨论】:

        【解决方案4】:

        $_SERVER['HTTP_REFERER'] 可能是你想要的

        参考

        【讨论】:

        • 你不能依赖 HTTP_REFERER 总是被填充。
        • 同意 - 但我能想到的唯一其他选择是生成存储在会话中的唯一哈希并将其包含在 AJAX 请求中,然后检查用户的会话以查看它的来源。这有点丑陋,可能有点矫枉过正。
        猜你喜欢
        • 2011-03-27
        • 2013-10-18
        • 1970-01-01
        • 2014-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多