2016-10-17 22 views
0

我使用的Codeigniter 3,我有一個腳本,當在我的HTML中使用正常工作。如果我將代碼放在外部文件中,則會收到403錯誤。Codeigniter jquery/ajax外部文件403

我的js文件位於根/ jQuery的/ JS/myfile.js

的錯誤是 「403禁止 - 本地主機/ mywebsite /主/ explode_link」。

enter image description here

下面是外部JavaScript的開始。

$(document).ready(function(){ 
     $('.mashed_row a').click(function() { 
      var link_id = $(this).attr('link_id'); 

     $.ajax({ 
        type: 'POST', 
        url: 'main/explode_link', 
        data: {'<?php echo $this->security->get_csrf_token_name(); ?>' : '<?php echo $this->security->get_csrf_hash(); ?>', link_id}, 
        dataType: 'json', 
        success : function(data) { 
         if(data){ 

這是我的外部鏈接。

 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script> 
    <script src="<?php echo base_url().'jquery/cookie.js'; ?>"></script> 
    <script type="text/javascript" src="<?php echo base_url().'jquery/js/rating.js'; ?>"></script> 
    <script type="text/javascript" src="<?php echo base_url().'jquery/js/mashed.js'; ?>"></script> 
    <?php echo (isset($include_js))? $include_js : ''; ?> 
    <script src="<?php echo base_url().'js/bootstrap.min.js'; ?>"></script> 

在HTML中正常工作的腳本如下。

 <script type="text/javascript"> 
     $('.mashed_row a').click(function() { 
      var link_id = $(this).attr('link_id'); 

     $.ajax({ 
        type: 'POST', 
        url: '<?php echo base_url(); ?>main/explode_link', 
        data: {'<?php echo $this->security->get_csrf_token_name(); ?>' : '<?php echo $this->security->get_csrf_hash(); ?>', link_id}, 
        dataType: 'json', 
        success : function(data) { 
+0

分享您的代碼,你必須添加一個外部文件 – Jobayer

+1

我會說這是一個服務器端的問題,分享您的服務器端代碼爲'explode_link' –

+0

我更新了我的帖子以包含此信息。 – ReeseB

回答

0

403禁止是由於csrf檢查失敗。這是因爲在$this沒有上下文的外部文件中對$this->security的兩次調用。換句話說,外部js不知道什麼$this意味着什麼(與視圖html不同)並且無法將有用數據放入用於設置data的對象中。

有幾種解決方案。一個是在你的外部js可以使用的視圖html頁面中創建一個var。

<script> 
var csrf = {'<?= $this->security->get_csrf_token_name(); ?>' : '<?= $this->security->get_csrf_hash(); ?>'}; 
</script> 

使用在外部JS

$(document).ready(function(){ 
    $('.mashed_row a').click(function() { 
    var link_id = $(this).attr('link_id'); 

    $.ajax(
     { 
      type: 'POST', 
      url: 'main/explode_link', 
      //combine csrf with link_id 
      data: $.extend(csrf, {link_id: link_id}), 
      dataType: 'json', 
      success : function(data) { 
       if(data){ 

其他選項上述變種包括使用JQuery提取從DOM CSRF散列。但是,您必須對令牌名稱進行硬編碼,或者按照上圖所示傳遞它。

另一種選擇是將id屬性添加到可用於jquery選擇器的csrf隱藏輸入。但是,這與在js中拼寫名稱的硬編碼沒有多大區別。

希望這會有所幫助。

+0

謝謝DFriend,這很好。我將令牌添加到視圖中,並且外部js按照設計工作。 – ReeseB

0

您對的.htaccess問題,把這個代碼是在.htaccess和重複測試

RewriteEngine on 
RewriteCond $1 !^(index\.php|jquery|js|robots\.txt) 
RewriteRule ^(.*)$ /index.php/$1 [L]