【问题标题】:Specify User Agent in Ajax call, how to do it the right way?在 Ajax 调用中指定用户代理,如何正确执行?
【发布时间】:2014-08-21 20:44:07
【问题描述】:

我正在用 PHP 和 ajax 编写我自己的实时访客计数器。

一切正常,但有一个小问题,就是每次调用 ajax 都算作一次额外访问。 我知道如何根据用户代理(例如机器人等)来分类特定的访问者,所以如果我只能在 ajax 调用中指定一个用户代理,我应该能够使 ajax 调用本身不计为一次访问。

现在,这是我的问题,如何正确指定用户代理与 Ajax 调用? 在这种特殊情况下,我想将用户代理指定为“googlebot”或类似的..

这是我的工作 ajax 代码:

<script type="text/javascript">
var interval = 5000;  // 1000 = 1 second, 3000 = 3 seconds
function doAjax() {
    jQuery.ajax({
            type: 'POST',
            url: '/codes/LiveVisitsStats/postlivecounter.php',
            data: jQuery(this).serialize(),
            success: function (data) {
            var arr = data.split('|');
                    jQuery('#counterint').html(arr[0]);
                    jQuery('#extrainfoscounter').html(arr[1]);
            },
            complete: function (data) {
                    // Schedule the next
                    setTimeout(doAjax, interval);
            }
    });
}
setTimeout(doAjax, interval);
</script>

一些额外的信息/澄清.. 跟踪代码本身可以完美运行。 问题仅出现在前端 UI 中,其中使用 ajax 动态显示统计信息,因为每次 ajax 调用更新页面上的统计信息时,它还会添加当前用户查看 ajax 驱动的 UI 的访问计数。

【问题讨论】:

  • 当 UA 字符串可以被欺骗时,为什么还要依赖它?
  • 我已经在使用基于 UA 的过滤器来消除统计数据中的机器人流量,所以我不妨将机器人代理应用到 ajax 调用本身,至少这是我的想法

标签: javascript jquery ajax


【解决方案1】:

不了解 PHP,但在 C# 中,这是我从 jQuery 确定它是否是 AJAX 的方式:

if (Request.Headers["X-Requested-With"] == "XMLHttpRequest"){
    // this is AJAX
}

所以如果上面是true,你可以避免更新你的数据库。我相信你知道 PHP 中的等价物。

【讨论】:

    【解决方案2】:

    一切正常,但有一个小问题,就是每次调用 ajax 都算作一次额外访问。

    一个(稍微)更好的解决方案是使用某个值来识别用户。我建议使用 cookie。

    • 在页面加载时生成一个包含唯一值的 cookie,例如某个 UUID 或其他内容。
    • 确保 cookie 在遥远的将来过期
    • 如果该 cookie 已经存在,请保留它。

    每次用户向服务器发出请求时,都会携带 cookie。服务器可以使用该值来识别用户。

    【讨论】:

    • 嗯,这是完全不同的方法。问题是我还想跟踪每个访问者的页面加载数量,我在 POST 处理 PHP 脚本中使用 MySQl 查询通过增加 DB 中的特定值来完成此操作。而且这很完美,唯一让系统混乱的是每次 ajax 调用都会触发当前用户浏览器的新访问。
    【解决方案3】:

    我发现 ajax 调用实际上并没有导致访问命中。恶意点击计数来自 CMS 系统中的另一个组件,我通过调整核心引擎以在用户重新加载同一页面时忽略计数来解决此问题。很简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-09
      • 1970-01-01
      • 2020-01-09
      • 2017-04-14
      • 2020-09-11
      • 1970-01-01
      • 2011-05-30
      相关资源
      最近更新 更多