2016-02-22 18 views
8

Tôi đang cố gửi yêu cầu POST qua jquery Ajax trong ứng dụng Laravel 5.1. Tôi có 405 phương pháp không cho phép, tôi tìm kiếm câu hỏi khác trên diễn đàn này nhưng không tìm thấy giải pháp:Không thể đăng trong laravel 5 qua jquery Ajax

My routes.php:

Route::post('backend/get_subdirectories', 'Backend\[email protected]_subdirectories'); 

Controller

public function get_subdirectories(Request $request) 
{ 
    dd($request); 
} 

Và kịch bản

var _token = $('meta[name="csrf-token"]').attr('content'); 
console.log(_token); //It work, I can get my token from meta tag 
$.post(
      'http://domain.com/backend/get_subdirectories/', 
      { _token: _token}, 
      function() { 
       alert("success"); 
      }) 
      .fail(function() { 
       alert("error"); 
      }) 
      .always(function() { 
       alert("finished"); 
      }); 

Và tôi gặp lỗi 405 - Phương pháp không được phép

Tôi đang làm gì sai?

+0

Đây có phải là dấu gạch chéo '/' ở cuối url không? – Chris

+0

@ Chris: Tôi không nghĩ như vậy –

+1

Bạn đã thử không? Và bạn đang thử yêu cầu này trên cùng một tên miền? – Chris

Trả lời

13

@ bình luận của Chris là đúng :)

Bạn chỉ cần loại bỏ các / từ cuối url của bạn. Yêu cầu ajax của bạn nên truy cập http://domain.com/backend/get_subdirectories.

Lý do là, bởi vì trong tệp public/.htaccess, nó sẽ chuyển hướng tất cả các url bằng dấu gạch chéo tới cùng một url mà không có. Mã thực hiện tại đây:

# Redirect Trailing Slashes If Not A Folder... 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)/$ /$1 [L,R=301] 

Bây giờ, vấn đề thực sự là khách hàng sẽ gửi yêu cầu GET đến URL được chỉ định bởi chuyển hướng 301.

Đợi đã! Tại sao nó sẽ làm điều này?

Vâng, chúng tôi có thể xem xét RFC7231 để có câu trả lời. Nó nói

6.4.2. 301 Moved Permanently

301 (Moved Permanently) mã trạng thái chỉ ra rằng mục tiêu
tài nguyên đã được gán một vĩnh viễn URI mới và
tài liệu tham khảo bất kỳ trong tương lai để cập khu vực này phải sử dụng một trong các URI kèm theo.
Khách hàng có khả năng chỉnh sửa liên kết phải tự động liên kết lại các tham chiếu với URI yêu cầu hiệu quả cho một hoặc nhiều tài liệu mới
được máy chủ gửi, nếu có thể.

Máy chủ NÊN tạo trường tiêu đề Vị trí trong phản hồi chứa tham chiếu URI ưa thích cho URI vĩnh viễn mới.
tác nhân người dùng CÓ THỂ sử dụng giá trị trường Vị trí cho tự động
chuyển hướng. Tải trọng phản hồi của máy chủ thường chứa một ghi chú siêu văn bản ngắn
siêu liên kết với một siêu liên kết đến (các) URI mới.

Note: For historical reasons, a user agent MAY change the request 
    method from POST to GET for the subsequent request. If this 
    behavior is undesired, the 307 (Temporary Redirect) status code 
    can be used instead. 

Phản hồi 301 có thể lưu vào bộ nhớ cache theo mặc định; tức là, trừ khi khác
được chỉ định bằng định nghĩa phương pháp hoặc điều khiển bộ nhớ cache rõ ràng (xem
Mục 4.2.2 của [RFC7234]).

Bây giờ điều thú vị là lưu ý ở phía dưới chỉ định rằng tác nhân người dùng CÓ THỂ thay đổi phương thức yêu cầu từ POST thành GET. Và có vẻ như hầu hết các tác nhân người dùng từ trình duyệt đến khung công tác, dường như tuân theo quy tắc đó.

+1

Cảm ơn bạn Kirill Fuchs, bạn là chuyên gia –

Các vấn đề liên quan