从Ajax的PHP脚本重定向

时间:2016-06-07 21:50:05

标签: javascript php jquery html ajax

我有一个这样的表格:

<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();”正在停止向用户发送PHP脚本的Ajax,但是用户可以自己去那里。

1 个答案:

答案 0 :(得分:3)

问题是,脚本需要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.

根据评论:

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

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