将XMLHttpRequest设置为服务器头(" location:index.php")功能不起作用?

时间:2014-09-13 19:53:40

标签: javascript php jquery html ajax

我在我的项目中使用Ajax,所以在header.php中我使用Javascript代码将XMLHttpRequest发送到服务器。我在网站的每个页面中都包含了这个h​​eader.php文件。 问题是在signin.php页面我正在使用头功能。由于我在标头中使用的Ajax代码,这是行不通的。当我从header.php中删除该代码时。标题功能正常。请帮帮我。

我在signin.php中使用的标题函数: 标题( “位置:的index.php”);

在header.php中使用Ajax代码:

<script>
function favourite(str)
{
var xmlhttp;
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    document.getElementById("like-div").innerHTML=xmlhttp.responseText;
    }
  }
xmlhttp.open("GET","add_to_favourites.php?"+str,true);
xmlhttp.send();
}
</script>

1 个答案:

答案 0 :(得分:0)

实际上,Location标头确实有效,但它会重定向在后台运行的Ajax请求,而不是在浏览器中触发完整的URL更改。浏览器透明地处理Ajax请求的这种重定向,因此最终发生的事情是#like-div的内容被 index.php 的完整HTML代码替换。

显然这不是这种情况下的预期行为,所以我们需要做的是在Ajax请求期间以某种方式检测重定向,并发回一些JavaScript以在浏览器中手动设置document.location

一种可能的解决方案是使用jQuery来放置Ajax请求(因为它支持在响应中支持浏览器独立的脚本执行),并在检测到XMLHttpRequest时发送JavaScript重定向代码而不是Location标头:

<强>的JavaScript

$("#like-div").load("add_to_favourites.php?" + str);
/* see how much easier it is with jQuery? */

<强>的header.php

/* Function for Ajax-friendly redirects */
function redirect_with_ajax($url, $permanent = false)
{
  @ob_end_clean();
  if(isset($_SERVER["HTTP_X_REQUESTED_WITH"]) && strtolower($_SERVER["HTTP_X_REQUESTED_WITH"]) === "xmlhttprequest")
  {
    print('<script> location.href = ' . json_encode($url) . '; </script><div>You are being redirected <a href="' . htmlentities($url, ENT_QUOTES, "UTF-8") . '">here</a>.</div>');
  }
  else
  {
    header($_SERVER["SERVER_PROTOCOL"] . " " . 
      ($permanent ? "301 Moved Permanently" : "302 Found"));
    header("Location: " . $url);
  }
  exit;
}

/* Do the redirect */
redirect_with_ajax("index.php");

代码未经测试,可能包含错误。请谨慎使用。