Php jqueryajax重定向问题 请考虑这一点:在A页,当JS关闭时,我有一个链接把你带到B页面,但是当JS打开时,我想用页面B. 替换当前页面上的内容。
页面A和B实际上是同一个脚本,能够区分AJAX调用和常规调用,并适当地提供内容。只要不涉及重定向,一切正常 但是,有时会出现301重定向,而客户端浏览器会发出第二个请求,然后返回200 OK。只有第二个请求发送时没有X-request-With头,因此我无法在脚本中判断它是否来自AJAX,并且将发送一个完整的页面,而不仅仅是内容 我曾尝试在我的错误、成功和完整处理程序中检查301状态代码,但都不起作用。它似乎在幕后处理301 有人能帮我吗 jQuery1.4,PHP5 编辑:人们要求提供此代码,我认为这不是必需的,但下面是:Php jqueryajax重定向问题 请考虑这一点:在A页,当JS关闭时,我有一个链接把你带到B页面,但是当JS打开时,我想用页面B. 替换当前页面上的内容。,php,jquery,ajax,redirect,Php,Jquery,Ajax,Redirect,页面A和B实际上是同一个脚本,能够区分AJAX调用和常规调用,并适当地提供内容。只要不涉及重定向,一切正常 但是,有时会出现301重定向,而客户端浏览器会发出第二个请求,然后返回200 OK。只有第二个请求发送时没有X-request-With头,因此我无法在脚本中判断它是否来自AJAX,并且将发送一个完整的页面,而不仅仅是内容 我曾尝试在我的错误、成功和完整处理程序中检查301状态代码,但都不起作用。它似乎在幕后处理301 有人能帮我吗 jQuery1.4,PHP5 编辑:人们要求提供此代码,
// hook up menu ajax loading
$('#menu a').live("click", function(){
// update menu highlight
if($(this).parents('#menu').size() > 0){
$("#menu>li").removeClass("current_page_item");
$(this).parent().addClass("current_page_item");
}
// get the URL where we will be retrieving content from
var url = $(this).attr('href');
window.location.hash = hash = url;
$.ajax({
type: "GET",
url: url,
success: function(data){
// search for an ID that is only present if page is requested directly
if($(data).find('#maincontent').size() > 0){
data = $(data).find('#maincontent .content-slide *').get();
}
// the rest is just animating the content into view
$("#scroller").html(data);
$('.content-slide').each(setHeight);
$('.content-slide').animate({
left: "0px"
}, 1000, 'easeOutQuart',
function(){
$('#home').css("left", "-760px").html(data);
$('#scroller').css("left", "-760px");
$('.content-slide').each(setHeight);
}
);
}
});
return false;
});
由于重定向后没有正确地传递头,因此一个好的选择似乎是允许一个查询字符串变量来指示请求的isAjax状态以及x-request-with头。因此,如果301重定向是由.htaccess文件生成的,则重定向时只需将查询字符串参数传递到新路径。例如:
RewriteEngine on
RewriteRule pageB.php$ pageC.php?%{QUERY_STRING} [L,R=301]
因此,您对pageB.php?isAjax=1的请求将是pageC.php?isAjax=1,从而产生来自服务器的正确格式的响应。由于您使用直接访问和AJAX加载pageB,我通常将简单的if放入这样的页面。 页面B将如下所示:
<?php $is_ajax = ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'); ?>
<?php if ( ! $is_ajax ): ?>
<html>
<!-- full page content for direct access -->
<?php endif; ?>
<!-- page content that for AJAX request and direct access -->
<div id="maincontent">
<!-- content here -->
</div>
<!-- end of page content that for AJAX request and direct access -->
<?php if ( ! $is_ajax ): ?>
<!-- rest of page content -->
</html>
<?php endif; ?>
这样,我就不需要从AJAX请求中过滤响应数据
我有一个问题要问你。这个代码做什么
window.location.hash = hash = url;
也许这就是导致这种奇怪的重定向的原因
如果您仍然遇到奇怪的重定向,使用Firebug进行调试并查看apache日志可能会帮助您找到错误源。您可以将假定位于B页的内容放入
标记中,如果Javascript实际上处于活动状态,则可以进行AJAX调用。不涉及任何链接…谢谢,但这不是一个选项,页面上几乎每个链接都将使用AJAX处理,an将下载页面的完整内容。您能提供页面A和页面B的结构吗?您希望B页内容显示在A页内,还是替换A页中的所有当前内容?为什么用户必须先转到A页,有什么原因吗?我想用B中相应的部分替换A的部分。我通过搜索要显示的ID的响应并提取它们,解决了我的问题。这是丑陋的,但它的工作,现在我只是在寻找一个更好的解决方案。再次,请张贴您的代码,这样我可以帮助您。看,这是一个问题。整个事情应该是一个Wordpress主题,所以我不能真正编辑.htaccess。我需要一种在JS或PHP中实现这一点的方法……根据生成301的原因,我可以想象Wordpress可以传递查询字符串参数,就像.htaccess在那里剪掉它一样。唯一的额外警告是,您需要配置Wordpress将isAjax查询字符串变量解释为AJAX请求的有效标识符,我相信这是可能的。谢谢您的回答,但我已经这么做了,这正是问题所在,对服务器/服务器上的请求会导致重定向,浏览器依次以正确的URL重新加载页面,但无法发送http_x_请求的_,这就是为什么您建议和我使用的解决方案不起作用的原因。window.location.hash=url作为历史记录的基础,并且通过电子邮件发送当前url的能力是服务器中的所有AJAX请求都没有HTTP\u X\u REQUESTED\u和或者只有a页和B页中的代码?也许为了解决这个问题,您可以在请求页面B时传递一个参数:$.get('pageB',{'partial':1},函数(数据){//process})代码>,但这仅适用于临时修复。不要依赖它。
window.location.hash = hash = url;