【问题标题】:Why it shows 403(forbidden) when making an ajax request?为什么在发出ajax请求时显示403(禁止)?
【发布时间】:2013-12-25 19:24:07
【问题描述】:

我已经用这个进行了 ajax 调用:

$('.start-rate-fixed').on('click', function(e){
        e.preventDefault();
        var videoRate = $('.start-rate input[name="rating"]:checked').val(),
            productId = parseInt($('.popover-content').prop('id'));
        $.ajax({
            url : ROOT + 'products/rate_video',
            type : 'POST',
            data : {
                'data[Product][id]' : productId,
                'data[Product][success_rate]' : videoRate
            }
        }).done(function(res){
            var data = $.parseJSON(res);
            alert(data);
        });
    });

我在 default.ctp 中将 ROOT 定义为我的 cakephp 项目的 webroot:

<script type="text/javascript">
    var ROOT = '<?php echo $this->Html->url('/');?>';
</script>

并尝试从我的产品控制器中定义的函数“rate_video”中检索数据,但出现此错误。我还尝试了一个简单的 ajax 作为测试功能,但它向我展示了同样的问题。

控制器代码

public function rate_video(){
        $this->autoRender = false;
        if($this->request->is('post') && $this->request->is('ajax')){
            $success_rate = $this->request->data['Product']['success_rate'];
            $this->Product->id = $this->request->data['Product']['id'];
            if($this->Product->saveField('success_rate', $success_rate)){
                echo json_encode('Successfully Rated');
            } else {
                echo json_encode('Error!!');
            }
        }
    }

【问题讨论】:

  • 在 ajax 请求之前调用console.log(ROOT); 的结果是什么?
  • 可以直接在浏览器中查看网址吗?你看到了什么?
  • 没有 PHP 代码是无法回答的。这是在本地设置上还是在其他地方的托管服务器上?可能是 ModSecurity 妨碍了您的通话。但可以是任何东西,你所展示的 JavaScript 不足以回答。
  • 从命令行调用curl -I [url of ajax] 会发生什么?此外,您的 PHP 错误日志或 Apache 错误日志中会显示什么(如果有的话)?
  • "什么都不会发生,因为 ..." 会发生什么,以及请求的 确切 url?意外的 403 可能表示正在执行不同的代码或没有代码正在执行。正如 JackGould 所说,检查日志以确定正在发生的事情(app/tmp 日志、php 日志、Web 服务器日志)

标签: php jquery ajax cakephp


【解决方案1】:

请在请求 URL 的末尾添加 dataType 和正斜杠 (/)

$.ajax({
        url : ROOT + 'products/rate_video/',
        type : 'POST',
        data : {
            'data[Product][id]' : productId,
            'data[Product][success_rate]' : videoRate
        },
        dataType: 'json',
    }).done(function(res){

【讨论】:

  • 请看顶部.. :-)
  • 抱歉,为什么您没有在 ajax 请求中包含 dataType? 403错误意味着服务器拒绝了你的请求。
【解决方案2】:

我刚刚遇到了同样的问题,并通过将 AJAX 调用中的 URL 放入我知道有效的 URL 来解决它。然后尝试直接在 Web 浏览器中访问您尝试通过 AJAX 调用的 URL - 很可能您正在访问没有创建视图文件的控制器。要解决此问题,您必须确保正在访问的控制器方法没有要呈现的视图 - 设置 $this->render(null)

【讨论】:

    【解决方案3】:
    1. 如果你的网址不正确,那么

      url: '<?php echo Router::url(array('controller' => 'Controllername', 'action' => 'actionname')); ?>'
      

      上面的 url 提供了 ajax 到 url 从 root 到您的操作。

    2. 403 的其他原因是您的身份验证功能,如果您在控制器中使用身份验证,则让您的 ajax 功能允许类似

      $this->Auth->allow('Your ajax function name here'); 
      

    【讨论】:

      【解决方案4】:

      您的脚本放置在localhost/dev.popover/products/rate_video 但ajax ROOT 是/ - 这意味着localhost/ 和ajax 发送请求到

      'localhost/products/rate_video'
      

      正确的解决方案是

      <script type="text/javascript">
          var ROOT = '<?php echo $this->Html->url('/dev.popover/');?>';
      </script>
      

      【讨论】:

      • 如果在更改域/项目名称时出现问题,会发生什么?我是否必须再次重新声明 ROOT.. 这不是完美的解决方案...
      • 尝试在您的项目配置文件中定义一个常量,并在需要时使用它
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 2019-08-10
      • 2013-10-20
      • 1970-01-01
      • 2014-01-25
      • 1970-01-01
      • 2018-02-21
      相关资源
      最近更新 更多