使用Jquery post时PHP不会重定向

PHP not redirecting when working with Jquery post

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
How to manage a redirect request after a jQuery Ajax call

我有一个通过jquery验证客户端的表单。然后jquery将这些数据传递给一个PHP脚本,以进行服务器端验证。在PHP脚本的末尾,我尝试在成功后重定向,但不会发生重新定向。

jquery是否干扰重定向?如何让PHP脚本重定向。不想用jquery重定向,bc我将使用会话,并希望在重定向时保留会话数据。

代码如下:

jQuery:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$.ajax({
                    //this is the php file that processes the data and send mail
                    url:"includes/process/processAdminLogin.php",
                    //POST method is used
                    type:"POST",
                    //pass the data        
                    data: dataString,    
                    //indicate result is text
                    dataType:"text",
                    //Do not cache the page
                    cache: false,
                    //success
                    success: function (data) {
                        $('input').removeAttr('disabled'); //enable input fields again.

                        if(data =="fail"){
                            $("#statusMessage").html("");
                            $("#statusMessage").html("<p class='statusBoxWarning'>Username and password do not match!
</p>"
);
                            $('button').removeAttr('disabled');
                            document.forms[0].reset();
                        }                              
                    }
                });

PHP

1
2
3
4
5
6
7
8
9
10
if($correctPass == 1){
ob_start();
session_start();
$_SESSION['usernameIdentity'] = $userName;
unset($userName, $userPass);
header("Location: ../../adminDashboard.html");
exit;
}else{
echo"fail";
}

PHP脚本到达重定向部分,然后挂断。我真的想保留jquery功能,以及php重定向。有更好的方法吗?

谢谢!

1
                              FINAL WORKING SOLUTION:

好的,在这个帖子和其他类似帖子的输入之后,这就是我的工作解决方案。这可能不是最有效或最漂亮的解决方案,但它是有效的,目前必须这样做。

JQuery

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$.ajax({
                    //this is the php file that processes the data and send mail
                    url:"includes/process/processAdminLogin.php",
                    //GET method is used
                    type:"POST",
                    //pass the data        
                    data: dataString,    
                    //indicate result is text
                    dataType:"text",
                    //Do not cache the page
                    cache: false,
                    //success
                    success: function (data) {
                        $('input').removeAttr('disabled'); //enable input fields again.
                        if(data =="success"){
                            $('#statusMessage').html('<form action="http://www.example.com/test/userRegistration/adminDashboard.html" name="userSubscription" method="post" style="display:none;"><input type="text" name="username" value="' + reg_contact_username + '" /><input type="text" name="password" value="' + reg_contact_password + '" /></form>');
                            document.forms['userSubscription'].submit();
                        }else{alert("couldn t redirect");}                              

                    }
                });

PHP

1
2
3
4
5
if($correctPass == 1){
echo"success";
}else{
echo"fail";
}

"接收重定向"页将必须验证再次提供的用户名和密码,因此验证将执行2x…这是非常低效的。如果有人能为我提供更好的解决方案-拜托!写一个样本也会有帮助。

谢谢!


由于Ajax发生在"幕后"(也就是说),重定向只会中断对JavaScript处理程序的响应。

您需要返回URL,并让您的回调将浏览器踢到一个新的位置。

更新:

注意,由于必须将数据返回到前端,因此您需要添加一个status或类似的变量,以便根据调用是否"失败"来切换前端行为。

更新2:

对于您的解决方案,我强烈建议您不要使用表单提交技术。正如您所说,它不高效,不漂亮,而且需要两倍的工作(验证用户2次)。

如果用户成功登录,为什么不使用PHP的内置会话处理来设置会话,然后在简单的javascript浏览器重定向之后简单地检查会话?

javascript重定向和window.href="http://mylocation"一样简单,如果您对PHP会话不太了解,可以使用我建立的这个类(请忽略它也在管理cookie,这是一个愚蠢的疏忽)。


在哪里刷新输出缓冲区?尝试在header()重定向之后添加ob_end_flush();,看看是否有效。

编辑:也许将相对URI转换为绝对URI可以解决问题。这是直接从php.net中提取的一般示例。它基于一个相对的URI创建一个绝对的URI——你可以一直硬编码绝对的URI,而不是这样做。

1
2
3
4
5
6
7
8
<?php
  /* Redirect to a different page in the current directory that was requested */
  $host  = $_SERVER['HTTP_HOST'];
  $uri   = rtrim(dirname($_SERVER['PHP_SELF']), '/\');
  $extra = '
mypage.php';
  header("Location: http://$host$uri/$extra");
  exit;
?>


尝试在Ajax调用中使用完整的URL。

而不是:

1
    url:"includes/process/processAdminLogin.php",

尝试:

1
    url:"http://www.mysite.com/includes/process/processAdminLogin.php",