我有一个这样的表格:
<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,但是用户可以自己去那里。
答案 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');
}