JavaScript-HTTP_X_REQUESTED_WITH在Firefox 4中无法正常工作

我正在使用此代码重定向我的用户,从而阻止了他们浏览器中只有ajax的页面

if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && 
    strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {}
else {
    header("Location: /");
}

它在Google chrome,Firefox 26和IE11上运行良好,但是在firefox 4中,即使使用ajax加载,标题也会被触发.

我怎样才能解决这个问题?

解决方法:

您可以尝试自己设置HTTP_X_REQUESTED_WITH标头,或设置其他标头并对其进行检查:

$.ajaxSetup({
        beforeSend: function (request)
        {
            request.setRequestHeader("HTTP_X_REQUESTED_WITH",'xmlhttprequest');
            request.setRequestHeader("BACKUP_FIREFOX_AJAX", 'xmlhttprequest');
        }
 });

接着

if((isset($_SERVER['HTTP_X_REQUESTED_WITH']) && 
   strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') || 
   (isset($_SERVER['BACKUP_FIREFOX_AJAX']) && 
   strtolower($_SERVER['BACKUP_FIREFOX_AJAX']) == 'xmlhttprequest'))

不知道它是否会在Firefox 4(确实是旧版本)中起作用,但是值得一试.

好的,在深入研究时,似乎存在一个古老的Firefox错误,其中:1)如果重定向了xhr,则自定义标头会丢失; 2)当“自动代理检测”运行时,firefox有时会进行内部重定向,从而触发1.中的问题

因此,您可能需要执行除标头之外的其他操作…也许将查询字符串参数附加到所有传出的ajax请求中,我不确定是否需要直接修改url或GET请求的数据,所以我会两者都做,并希望它能起作用:

$.ajaxSetup({
  beforeSend: function(jqXHR, settings) {
      if (settings.url.split('?').length > 1) {
         settings.url = settings.url + '&ajax=1';
      }
      else {
          settings.url = settings.url + '?ajax=1';
      }
   },
data: {
    ajax: '1'
  }
});

然后您可以执行以下操作:

if((isset($_SERVER['HTTP_X_REQUESTED_WITH']) && 
strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') || 
$_GET['ajax']==1)

相关文章

IE6是一个非常老旧的网页浏览器,虽然现在很少人再使用它,但...
PHP中的count()函数是用来计算数组或容器中元素的个数。这个...
使用 AJAX(Asynchronous JavaScript and XML)技术可以在不...
Ajax(Asynchronous JavaScript and XML)是一种用于改进网页...
本文将介绍如何通过AJAX下载Excel文件流。通过AJAX,我们可以...
Ajax是一种用于客户端和服务器之间的异步通信技术。通过Ajax...