为什么在发出ajax请求时会显示403(禁止)?

时间:2013-12-25 19:24:07

标签: php jquery ajax cakephp

我用这个做了一个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!!');
            }
        }
    }

4 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

  1. 如果你的网址不正确,那么

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

    以上网址提供了从根到您的操作的URL的ajax。

  2. 403的其他原因是你的auth功能,如果你在你的控制器中使用auth然后让你的ajax功能允许像

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

答案 3 :(得分:-1)

您的脚本位于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>