HTTP_X_REQUESTED_WITH在firefox 4中无法正常工作

时间:2014-01-30 15:48:20

标签: javascript php ajax firefox

我正在使用此代码重定向我的用户,从浏览器中阻止仅限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加载也会触发标头。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

您可以尝试自己设置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有时会做一个< em>内部重定向,触发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)