我正在使用此代码重定向我的用户,从浏览器中阻止仅限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加载也会触发标头。
我该如何解决这个问题?
答案 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)