正在处理一个需要我执行JS重定向到页面的项目,通过AJAX查询在PHP中设置会话变量,然后检查以确保会话已设置。成功检查后,将在JS中构建重定向URL并执行重定向。
到目前为止,我得到的是:
<?php
$v_ip = $_SERVER['REMOTE_ADDR'];
$hash = md5($v_ip);
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script>
$.ajax({
type : 'POST',
url : './session.php',
dataType: "json",
data: "<?php echo $hash; ?>",
success : function(data){},
error : function(){}
});
</script>
<script>
<?php
if(isset($_SESSION['allow'])) {
echo "var url = \"url-here/?token=\";
var token = \"token\";
var redirect = url.concat(token);";
}
?>
window.location.replace(redirect);
</script>
</head>
</html>
设置变量的PHP代码:
<?php
session_start();
$v_ip = $_SERVER['REMOTE_ADDR'];
$hash = md5($v_ip);
if(isset($_POST["$hash"])) {
$_SESSION['allow'] = true;
}
?>
在初次访问该页面时,所有内容都已正确处理,并且可以直到实际重定向。设置会话变量,在页面代码中正确输出JS代码,并且由于某些奇怪的原因,实际的window.location.replace函数未被激活。该页面保持空白 - 检查时,源代码正确显示所有内容,但重定向不会发生。如果我再次访问该页面,重定向就可以了。
如果我在两个文件中更改了会话变量的名称,并且必须重新将其重新设置,则会发生同样的事情 - 在初次访问时,重定向不会被处理,但显然一直到实际重定向都是再次正确处理。
为什么会这样?
答案 0 :(得分:0)
第一次进入该页面时,会话变量尚未设置。因此if
将失败,变量分配不会被放入<script>
。然后,浏览器将执行设置会话变量的AJAX调用,但是影响原始页面的时间太晚,您必须再次访问该页面以查看其效果。
请记住,页面中的所有PHP首先在服务器上执行,输出发送到浏览器,然后执行JS。
我建议您将执行重定向的代码放入success:
的{{1}}函数。
答案 1 :(得分:0)
我认为有几件事需要操纵。
首先,php本身就是一个模板引擎。那是什么意思?这意味着它会尽可能地将PHP脚本翻译成html。所以下面的这个块将被翻译成html并保持静态。
<?php
if(isset($_SESSION['allow'])) {
echo "var url = \"url-here/?token=\";
var token = \"token\";
var redirect = url.concat(token);";
}
?>
也就是说,重定向变量是在Ajax调用之前确定的。这也可以解释为什么第二次访问页面时重定向工作但不是第一次。
其次,尽管在window.location.replace
之前放置与Ajax相关的代码并不意味着它们会按照您的预期按照所需顺序进行拍摄。这是因为Ajax调用是异步操作,您无法预测何时会得到响应。在这种情况下,我会将window.location.replace
事件放入Ajax调用成功回调中,如:
$.ajax({
type : 'POST',
url : './session.php',
dataType: "json",
data: "<?php echo $hash; ?>",
success : function(data){
window.location.replace(data.url)
},
error : function(){}
});
第三,您应该检测服务器端的isset($_SESSION['allow'])
事件并以类似JSON的格式响应:
{
url: desired_url
}
希望这有帮助。祝你好运。