【问题标题】:PHP redirect from Ajax Call来自 Ajax 调用的 PHP 重定向
【发布时间】:2014-04-27 10:41:29
【问题描述】:

我正在使用 Ajax(使用本机 JavaScript)和 php 的组合来构建登录。

from 位于一个 php 文件 (login.php) 中。当它被提交时,它运行一个 JS onlclick 函数,该函数将表单数据发布到另一个验证表单数据的 php 文件:

<input type="button" name="submit" value="Submit" onclick="JavaScript:xmlhttpPost('validator.php')"/>

validator.php 的结果使用 JavaScript 在 div 中返回:

function updatepage(str){

document.getElementById("result").innerHTML = str;

}

最后,如果密码和用户名都正确,validator.php 会像这样运行重定向:

if ( // form data is valid ) {

    header("Location: welcome.php");

}

但是,由于一切都是通过 ajax 运行的,这会导致“welcome.php”页面显示在原始登录页面的“results”div 中。

有没有办法通过 JavaScript 发送重定向?

【问题讨论】:

  • 如果你仍然要加载一个新页面,你为什么首先使用 Ajax?

标签: javascript php html ajax


【解决方案1】:

我找到了一个可行的解决方案,而不是实际可行的答案。我不确定这是否是正确的做法,但效果很好。

当表单值正确时,我在我的 validator.php 中输入以下内容:

if ( // form data is valid ) {

    echo 'redirect';

}

然后,在我的登录页面上,当从 php 页面返回字符串时,我输入了这个:

function updatepage(str){

   if (str.match(/redirect/)) {
      window.location.replace('welcome.php');
   }
   else {
      document.getElementById("result").innerHTML = str;
   }
}

这个想法是,当 validator.php 确认登录凭据正确时,它会返回一个字符串。

如果该字符串匹配“redirect”,JavaScript 将重定向页面。

如果有人对此有任何意见,请发表评论。我觉得这是一个很好的解决方案。很惊讶我之前没想到。

【讨论】:

    【解决方案2】:

    您可以使用以下代码通过 JavaScript 重定向:

    window.location.href = 'welcome.php';
    

    当您进行 AJAX 调用时,您无法通过 PHP 等服务器端应用程序进行重定向。

    您必须得到响应并在您的 JavaScript 中执行此操作。

    这是一个使用 jQuery 和 PHP 的 ajax 请求示例。

    将此代码放在您的前端(视图):

    <script type="text/javascript">
        $(document).ready(function(){
            $.ajax({
                url: 'your-php-file.php',
                dataType: 'html',
                success: function(response) {
                    window.location.href = response;
                }
            });
        });
    </script>
    

    https://api.jquery.com/jQuery.ajax/

    在你的 PHP 文件中,在你做你想做的事之后;回显要重定向的路径或文件作为响应。

    <?php
        echo "file-or-path-to-redirect.php";
    

    【讨论】:

    • 我将如何通过 php 返回它?我试过 echo 但它不起作用。
    • 基本上,使用jquery来发出ajax请求。简单快捷。我将对我的帖子进行编辑。
    • 我没有使用 jQuery - 原生 JS。
    【解决方案3】:
    window.location.href='welcome.php';
    

    或使用真实路径

    window.location.href='http://www.yourdomain.com/welcome.php';
    

    【讨论】:

      【解决方案4】:

      你可以使用窗口对象

      window.location.href="http://example.com/welcome.php";
      

      【讨论】:

        【解决方案5】:

        最简单的方法是使用 json 响应来模拟它。然后你解析 json 看看你得到了什么样的响应。这是一个工作示例:

        Index.html

        <!DOCTYPE html>
        <html>
        <head>
        <script>
        
        function updatepage(str){
        
        document.getElementById("result").innerHTML = str;
        
        }
        
        
        function loadXMLDoc()
        {
        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)
            {
        
              var jsonParse = JSON.parse(xmlhttp.responseText);
        
              if(jsonParse.redirect){
                window.location.replace(jsonParse.redirect);
              }
              if(jsonParse.success){
                updatePage(success);
              }
            }
          }
        
        xmlhttp.open("GET","login.php",true);
        xmlhttp.send();
        }
        </script>
        </head>
        <body>
        
        <div id="myDiv"><h2>Let AJAX change this text</h2></div>
        <button type="button" onclick="loadXMLDoc()">Change Content</button>
        
        </body>
        </html>
        

        login.php

        <?php
        
        
        // if($error)
        echo json_encode(array('redirect'=>'welcome.php'));
        
        //else
        echo json_encode(array('success'=>'<div>logged in</div>'));
        
        ?>
        

        【讨论】:

        • 不,你不能。 XMLHttpRequest 对象透明地处理重定向。它永远不会为您提供对 301 响应的访问权限,因为它将服从重定向,获取下一个资源,然后为您提供该资源的 200 响应。
        • 啊,我明白了。因此,您检查前端的 JavaSCript 以查看是否已从后端调用了 php 重定向。如果有,您使用 JavaSCript 重定向页面。对吗?
        • @user3143218 — 这就是 seblaze 试图做的事情,但由于我在评论中解释的原因,它不会起作用。
        • 啊,我明白了。您可以使用 match/onchange 函数来检查结果 div 是否与字符串匹配然后重定向?
        • @user3143218 为什么不返回一个json对象,然后在你的javascript中解析它而不是重定向它?例如,在您的 php 中,您将返回 json_encode(array('redirect'=>'welcome.php'));在 javascript 中更容易做到这一点
        猜你喜欢
        • 2014-05-22
        • 1970-01-01
        • 2014-07-11
        • 1970-01-01
        • 2020-03-10
        • 2016-04-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多