【问题标题】:Correct way to redirect in both PHP and Ajax called PHP?在称为 PHP 的 PHP 和 Ajax 中重定向的正确方法?
【发布时间】:2014-11-05 21:43:09
【问题描述】:

好的,所以我目前在 PHP 中使用这样的东西来重定向用户:

//This is a simplified version, but demonstrates it's use.
function redirect($location) {
    header("Location: $location");
}

如果用户的会话已过期,或者如果他们尝试执行需要他们登录的操作,则将用户重定向到登录页面,这会将他们发送到 404 页面。

所以在 PHP 中我可以输入:

redirect("index.php/xyz");

我的问题是我现在使用大量通过 Ajax 调用的 PHP 来处理表单和更新内容等事情;而且这种重定向方法在通过 Ajax 调用时不起作用。

我打算只更改此函数以使用 Javascript 而不是 PHP。

所以我会使用这样的东西:

function redirect($location) {
    echo '<script>';
        echo 'window.location.replace("'.$location.'");';
    echo '</script>';
}

据我所知,这适用于普通的 PHP 使用和对 PHP 的 Ajax 调用。

这是不好的做法吗?目前仅将其用于 Ajax 调用会导致大量代码开销,因此将其用于所有事情是有意义的。

澄清;我正在寻找一种适用于普通 PHP 和对 PHP 的 Ajax 调用的解决方案,因此我可以对两者使用相同的代码 - 而不必分别进行。例如在提交表单时,action="dosomething.php",根据情况,该文件可能只是在数据库中添加一行或重定向到某个页面。但这可以使用 Ajax 或普通的 HTML 表单操作来调用。

【问题讨论】:

  • 如果你理解正确,你想重定向ajax调用还是只需要发送404?
  • 以您喜欢的方式等。仅使用redirect 函数进行重定向可能很好,但您还需要eval 返回的javascript 以及我一般不喜欢的。在我看来,除非你想改变逻辑,否则你无法避免在客户端出现eval
  • @RahilWazir 我想重定向 ajax 调用和普通 PHP 调用。我在问题末尾添加了一个示例。

标签: javascript php ajax function redirect


【解决方案1】:

我会在您的 Javascript 上创建一个通用的 AJAX 函数来执行所有 ajax 调用。然后在该全局函数中,您将添加检查返回值是否为 -1 或其他内容并执行 javascript 重定向。

示例 JS 函数(假设您使用的是 JQuery):

function ajaxCall(url, data, requestType, ...) {
   $.ajax({
       type: requestType,
       url: url,
       data: data,
       dataType: 'json',
       success: function(result) {
           if (result.Status == 'Redirect') {
               window.location = result.RedirectLink;
           }
       }
   });
}

然后使用上面的 js 函数 ajaxCall() 进行所有 ajax 调用。

然后在您的 PHP 中,您将返回如下内容:

echo json_encode(array('Status' => 'Redirect', 'RedirectLink' => '/'));

以上方法在以后发生变化时更容易修改。

【讨论】:

  • 我会使用 jQuery.ajaxSetup() 作为状态码。包装在函数调用中是一种矫枉过正。
  • @E_p 同意。包装在一个函数中使其更加灵活,但可以进一步定制
  • 我刚刚在我的问题底部添加了一些说明。我正在寻找一种适用于 PHP 和 Ajax 调用 PHP 的解决方案。您的解决方案意味着两者都使用完全不同的方法。
  • @user3420034 这样您的 PHP 中就不必有任何 JS。当请求不是 AJAX 时,您使用 PHP 重定向,当它的 ajax 请求时,您使用 ajax 函数的 JS 重定向
  • @GGio 我将如何使用这种方法,例如在提交给dosomething.php 的表单中,这样它在这两种情况下都适用?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
  • 2012-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-24
相关资源
最近更新 更多