HTTP_X_REQUESTED_WITH 在 Firefox 4 中无法正常工作

use*_*661 3 javascript php ajax firefox

我正在使用此代码重定向我的用户,阻止浏览器中的 ajax 页面

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

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

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

dav*_*ave 5

您可以尝试自己设置 HTTP_X_REQUESTED_WITH 标头,或者设置不同的标头并检查它:

$.ajaxSetup({
        beforeSend: function (request)
        {
            request.setRequestHeader("HTTP_X_REQUESTED_WITH",'xmlhttprequest');
            request.setRequestHeader("BACKUP_FIREFOX_AJAX", 'xmlhttprequest');
        }
 });
Run Code Online (Sandbox Code Playgroud)

进而

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'))
Run Code Online (Sandbox Code Playgroud)

不确定它是否会工作,因为它是 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'
  }
});
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

if((isset($_SERVER['HTTP_X_REQUESTED_WITH']) && 
strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') || 
$_GET['ajax']==1)
Run Code Online (Sandbox Code Playgroud)