【问题标题】:Redirect from Ajax's PHP script从 Ajax 的 PHP 脚本重定向
【发布时间】:2016-06-07 21:50:05
【问题描述】:

我有这样的表格:

<form action="process.php" method="post">
    <input type="text" name="input" />
    <button type="submit">Submit</button>
</form>

我有一个这样的 Ajax 脚本:

$("button").click(function(event) {
    var $ajaxData = {
        "input-val" : $("input").val();
    }

    $.ajax({
        type : "POST",
        url : "process.php",
        data : $ajaxData,
        dataType : "json",
        encode : true
    });
    .done(function($data) {
        alert($data["stat"]);
    });

    event.preventDefault();
    $("form").unbind();
});

也是一个 PHP 脚本 (process.php) 发送表单数据的地方:

<?php
if(isset($_POST['input-val'])) {
    $data['stat'] = 'success';
    echo json_encode($data);
}
?>

一切都正确并设置好了,但是,如果我想阻止用户查看或(手动)进入“process.php”页面,我会添加一个重定向功能:

<?php
if(isset($_POST['input-val'])) {
    $data['stat'] = 'success';
    echo json_encode($data);
}
header('Location: index.php');
?>

这使得 Ajax 的请求自动失败。 如何阻止用户访问或查看 PHP 脚本?
正如我所说,"event.preventDefault();" 正在阻止 Ajax 将用户发送到 PHP 脚本,但用户可以自己去那里。

【问题讨论】:

  • 您可以有条件地重定向(或只是终止脚本),前提是发布的值不存在。但考虑到用户可以将他们自己的数据发布到您的 PHP 脚本中。另请参阅How to tell if a page is being called via Ajax, or on it's own
  • 您可以将标题放在else 语句中:if(isset(...)){ /*do something*/ } else { header('...'); }
  • 您的var $ajaxData defn 中是否缺少等号?
  • @gibberish 是的,那是我在这里写问题的时候:|
  • 别担心,只是想指出这一点。希望您的问题现在得到解决。

标签: javascript php jquery html ajax


【解决方案1】:

问题是,脚本需要 JSON,而您的“重定向”代码将 HTTP 301 发送到 HTML 文件。最终,AJAX XHR 看不到您的 JSON,而是获得了 HTML 输出。

将您的代码恢复到以前的状态:

<?php
if(isset($_POST['input-val'])) {
    $data['stat'] = 'success';
    echo json_encode($data);
}

相反,在 AJAX 处理程序中执行此操作:

.done(function($data) {
    alert($data["stat"]);
    if ($data["stat"] == "success")
        location.href = 'index.php';
}) // And you are also missing a ) here.

根据cmets:

如果您在未设置$_POST 的情况下进行重定向,请使用else

if (isset($_POST['input-val'])) {
    $data['stat'] = 'success';
    echo json_encode($data);
} else {
    header('Location: index.php');
}

【讨论】:

  • 他们不会在 ajax 请求之后尝试重定向,而是在您没有发出 ajax 请求时从 php 页面重定向。
  • @JonathanKuhn 啊,我明白了。
  • @ElcompJR 最好为 JSON 和其他输出老板创建一个单独的页面。
猜你喜欢
  • 2015-06-08
  • 2011-08-31
  • 2010-10-25
  • 2021-05-18
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
相关资源
最近更新 更多