2013-07-09 34 views
17

Tôi đang viết một API và sử dụng Laravel 4 để đạt được điều đó. Api của tôi là ở một tên miền khác. giả sử rằng đó là: http://api-example.com/CORS với Laravel 4

Và khi tôi cố gắng thực hiện yêu cầu ajax qua Backbone để api từ ứng dụng web của tôi (tức là mydomain.com) với xác thực cơ bản, đôi khi nó hoạt động tốt, nhưng đôi khi nó không hoạt động. Tôi đang cố gắng tìm ra lý do. Dưới đây là bộ lọc App::before và bộ lọc App::after của tôi.

App::before(function($request) 
{ 
    if($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { 
     $statusCode = 204; 

     $headers = [ 
      'Access-Control-Allow-Origin'  => 'http://mydomain.com', 
      'Allow'       => 'GET, POST, OPTIONS', 
      'Access-Control-Allow-Headers'  => 'Origin, Content-Type, Accept, Authorization, X-Requested-With', 
      'Access-Control-Allow-Credentials' => 'true' 
     ]; 

     return Response::make(null, $statusCode, $headers); 
    } 
}); 

Và tôi sau khi lọc:

App::after(function($request, $response) 
{ 
    $response->headers->set('Access-Control-Allow-Origin', 'http://mydomain.com'); 
    $response->headers->set('Allow', 'GET, POST, OPTIONS'); 
    $response->headers->set('Access-Control-Allow-Headers', 'Origin, Content-Type, Accept, Authorization, X-Requested-With'); 
    $response->headers->set('Access-Control-Allow-Credentials', 'true'); 
    return $response; 
}); 

Vấn đề là khi tôi cố gắng để thực hiện một yêu cầu bưu điện đến /login với các thông tin, API kiểm tra db và được khóa API cho người dùng. Điều này chỉ làm việc tốt. Nhưng khi tôi cố gắng để thực hiện một yêu cầu POST để /users chrome chỉ mang lại cho tôi lỗi sau:

XMLHttpRequest cannot load http://api-example.com/users. Origin http://mydomain.com is not allowed by Access-Control-Allow-Origin. 

tôi đã cố gắng tất cả mọi thứ, chẳng hạn như thiết lập Access-Control-Allow-Origin để '*' tất cả mọi thứ tôi có thể có thể tìm thấy từ internet. Nhưng không có gì làm việc cho đến nay. Tôi không biết mình nên làm gì.

+1

Kiểm tra mạng bằng một cái gì đó như Công cụ Chrome Dev cho thấy rằng nó có ở đó hay không ở đó (tiêu đề)? –

+0

Bất kỳ hoạt động không GET nào đều thực hiện yêu cầu OPTIONS "trước khi bay" - vì có vẻ như bạn đã biết. Đảm bảo rằng bộ lọc trước của bạn được chạy ngay cả khi không có tuyến đường nào tồn tại để phù hợp với bộ lọc đó. Ngoài ra, bạn có đang thử các yêu cầu PUT hoặc DELETE không? Tiêu đề của bạn không cho phép các tiêu đề đó. Cuối cùng, không thể sử dụng nguồn gốc '*' với ủy quyền. Trên thực tế, lưu ý cuối cùng: yêu cầu Ajax của bạn trông như thế nào? jQuery có cài đặt để gửi yêu cầu có ủy quyền. – fideloper

+0

Tôi không nghĩ rằng các tiêu đề được đặt. Thay vì '$ response-> headers-> set()' try 'header ('Cho phép: GET, POST, OPTIONS')' có thể làm việc –

Trả lời

0

Một số trình duyệt có thể từ chối điều này, bởi vì các tập lệnh XSS đang làm những điều khó chịu theo cách đó.

Nếu bạn tải tập tin js của bạn từ http://api-example.com/ có thể giúp đỡ, nhưng có những giải pháp ổn định hơn:

  • Bạn có thể sử dụng curl (hoặc một cái gì đó tương tự) hoặc
  • Bạn có thể sử dụng một proxy (Apache, Nginx , vv) cho yêu cầu AJAX của bạn để tải phản hồi từ các máy chủ khác
  • hoặc nếu bạn đang useing một cân bằng tải, hay frontend cacheing công cụ, bạn có thể tạo một quy tắc ...

Nó de dựa trên cơ sở hạ tầng và nhu cầu của bạn, nhưng nếu hiệu suất có vấn đề, hãy bỏ qua curl.

+0

Tôi xin lỗi, nhưng tôi thực sự là newbie về các công cụ cân bằng tải, bạn có thể giải thích chi tiết, nếu nó là OK cho bạn? Bởi vì tôi đang sử dụng Amazon ELB cho cân bằng tải, và tôi không biết ý nghĩa của việc 'tạo ra một quy tắc'. –

3

Không có điểm tạo đối tượng phản hồi lạ mắt và trả lại, sau đó cho phép quá trình trang chạy vì nó sẽ xóa tiêu đề CORS của bạn và tiếp tục với nội dung thông thường.

App::before(function($request) 
{ 
    if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { 

     header('Access-Control-Allow-Origin', 'http://mydomain.com'); 
     header('Allow', 'GET, POST, OPTIONS'); 
     header('Access-Control-Allow-Headers', 'Origin, Content-Type, Accept, Authorization, X-Request-With'); 
     header('Access-Control-Allow-Credentials', 'true'); 

     exit; 
    } 
}); 
6

Có lỗi trong tên tiêu đề.

header('Allow', 'GET, POST, OPTIONS'); // This is wrong. 

header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS'); // This is right.    
+0

Đây là lỗi thực sự. Tôi đang làm điều tương tự với RESPONSE chính xác và nó đang làm việc tốt với tôi. @ Chuyên ngành kỹ thuật – Raftalks