【问题标题】:Differentiate between a browser GUI request and an AJAX request区分浏览器 GUI 请求和 AJAX 请求
【发布时间】:2012-04-14 19:25:11
【问题描述】:

在我的 PHP 脚本中区分普通浏览器 GUI 请求和 AJAX 请求的最佳方法是什么?

【问题讨论】:

标签: php


【解决方案1】:

不是这样的。

您可以编写您的 JavaScript,以便在您可以使用的请求标头中留下某种标识符。请参阅 XHR setRequestHeader 方法。

HTTP 的一个很好的用途是修改Accept 标头,然后进行正常的内容协商。然后(例如),您不必关心它是否是 Ajax,而只需关心 HTML 响应是否优于 JSON 响应。

另一个约定是使用非标准的X-Requested-With 标头,其值为XMLHttpRequest。默认情况下,许多 JavaScript 库会将此添加到使用 XHR 的任何请求中。

这些技术中的任何一个都只能用于 XMLHttpRequest 或基于插件的 Ajax。您不能为基于 JSON-P 或 iframe 的 Ajax 设置任意 HTTP 标头。

【讨论】:

  • 感谢您的信息。那么使用 JavaScript 发送“X-Requested-With”标头在所有浏览器中是否可靠?还是使用额外的 GET 参数,例如:my_page.php?request_method=ajax 更可靠?
  • 很好地支持使用setRequestHeader 添加新标头。
【解决方案2】:

就服务器而言,普通请求和Javascript发起的请求没有什么特别的区别。

如果您想识别特定品牌的请求,合理的方法是传递自定义标头。

$.ajax(uri, {
  beforeSend: function(xhr) {
    xhr.setRequestHeader('X-YourApp-AJAX', '1');
 });

如果您使用的是 Apache,那么检查您刚刚在 PHP 中设置的标头就很容易了。

$headers = getallheaders();

if(isset($headers['X-YourApp-AJAX'])) {
   // AJAX request
} else {
   // ...
}

编辑

看起来 jQuery 已经在 AJAX 请求中传递了 X-Requested-With 标头 - 优先使用它。

【讨论】:

  • 这似乎是一个很好的解决方案。 xhr.setRequestHeader('X-YourApp-AJAX', '1'); 也是如此会在所有浏览器上工作吗?
  • 底层XMLHttpRequest 对象在所有现代浏览器中实现。 IE6 不支持它by that name,但您选择的 Javascript 框架将使您无需在不存在的地方手动定义它。
猜你喜欢
  • 2010-09-17
  • 2012-01-30
  • 1970-01-01
  • 2014-06-28
  • 1970-01-01
  • 2020-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多