javascript - 在第二次调用 jquery 时出现 403 AJAX 错误
问题描述
我有一个包含客户选择字段的简单表单。选择客户端后,我将进行 ajax 调用以获取客户端徽标并显示在选择字段下方供用户查看。这工作正常。AJAX 请求如下所示:
$.ajax({
url: '/clients/access_controls/<?php echo basename(__FILE__);?>',
type: 'post',
data: clientId,
//dataType: 'application/json',
//contentType: 'application/x-www-form-urlencoded',
error: function(jqXhr, textStatus, errorMessage) {
alert('ERROR MESSAGE: ' + errorMessage);
return false;
},
success: function(d) {
$(d.html).insertAfter(tab.find('table tr:eq(0)'));
var func = d.responseScript;
if ($.isFunction(eval(func))) {
eval(func + '()');
}
}
});
问题是,一旦我从列表中选择了另一个客户端,Ajax 调用就会返回 403 FORBIDDEN 错误。可能是什么问题?令我困惑的是第一次调用很好,为什么第二次失败。这是一个非常简单的问题,但我无法解决它。我尝试使用请求设置不同的内容类型,还尝试在处理请求的 PHP 文件上设置“Access-Control”标头,如下所示:
header('Content-type: application/json');
//header('Access-Control-Allow-Headers', 'api-key,content-type');
header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Headers: X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method");
//header('content-type: application/x-www-form-urlencoded; charset=UTF-8');
无济于事。任何帮助将不胜感激。提前致谢。
这是php代码
if (isset($_POST['request'])) {
if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
header('Content-type: application/json');
//header('Access-Control-Allow-Headers', 'api-key,content-type');
//header('Access-Control-Allow-Origin: *');
//header("Access-Control-Allow-Headers: X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method");
//header('content-type: application/x-www-form-urlencoded; charset=UTF-8');
}
switch ($_POST['request']) {
case 'logos':
if (!isset($_POST['sub'], $_POST['value'])) {
echo json_encode([
'error' => 'Invalid arguments'
]);
exit;
}
$logo = getClientLogo($_POST['value']);
$html = '<tr><td valign="top">Current Logo:</td><td valign="top" class="client_logo">' . ((!empty($logo)) ? $logo : '<strong>No Logo</strong>') . '</td></tr><tr><td>Upload new logo:</td><td><form method="post" enctype="multipart/form-data" target="member_image" action="/clients/access_controls/' . basename(__FILE__) . '"><input type="file" name="member_image" class="hidden" /><input type="button" value="Select File" data-usage="member_image" data-event="click" data-label="member_filename" /> <span class="member_filename">No file selected</span> <input type="submit" value="Upload & Save >" /><input type="hidden" name="request" value="image_upload" /><input type="hidden" name="value" value="' . $_POST['value'] . '" /><input type="hidden" name="iil_token" value="' . getCSRFToken() . '" /></form><input name="member_image" style="display: none;" /></td></tr>';
print json_encode([
'html' => $html,
'responseScript' => 'IIL.applyImageUploadRequirements'
]);
exit;
解决方案
如果您有 Mod Security - 尝试将其关闭并查看是否有效。我最近在从 ajax 调用到 php 脚本时遇到了 403 错误 - 如果内容包含单词“include”,它会给出 403。关闭 mod-security 让它工作,直到我们发现有问题的规则。
推荐阅读
- go - ElasticSearch 5.6 > 7.x 升级,是否有 auto_generate_phrase_query 等效项?
- javascript - 通过浏览器插件访问任何站点的服务工作者上下文/世界/执行环境以代理 self.registration.showNotification?
- mainframe - Apache commons net FTPClient storeFile() 创建带有用户名前缀的文件
- java - 重定向到带有连字符的 URL 不起作用
- docker - Docker mkdir 没有创建目录
- node.js - 在需要冲突版本的项目中,如何正确解决 NPM 依赖关系?
- python - 如何获取正在运行的 Blender 脚本路径
- ios - 在 react-native-matomo 中找不到 React/RCTAssert.h 文件
- node.js - 如何使 req.body.password 不等于未定义?
- python-3.x - 使用自定义聚合调用 Dask groupby 时出错