首页 > 解决方案 > 在第二次调用 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" />&nbsp;&nbsp;<span class="member_filename">No file selected</span>&nbsp;&nbsp;<input type="submit" value="Upload &amp; Save &gt;" /><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;

标签: javascriptphpajax

解决方案


如果您有 Mod Security - 尝试将其关闭并查看是否有效。我最近在从 ajax 调用到 php 脚本时遇到了 403 错误 - 如果内容包含单词“include”,它会给出 403。关闭 mod-security 让它工作,直到我们发现有问题的规则。


推荐阅读