01/10/2018, 11:06

No 'Access-Control-Allow-Origin' header is present on the requested resource

Mấy anh cho em hỏi chút ạ.
Em viết đoạn JS Ajax như dưới đây để get data từ link này http://api.2dev4u.com/json/posts nhưng gặp lỗi này

 XMLHttpRequest cannot load http://api.2dev4u.com/json/posts. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://dev.2dev4u.com' is therefore not allowed access.

có cao nhân nào giúp đỡ em hướng giải quyết được không ạ. Cái này là do server hay sao ạ?

$(document).ready(function() {

    var url = 'http://api.2dev4u.com/json/posts';
    var settings = {
        "async": true,
        "crossDomain": true,
        "url": url,
        "method": "GET",
        "headers": {
            "cache-control": "no-cache",
        }
    }

    $.ajax(settings).done(function(response) {
        console.log(response);
    });
});
Dark.Hades viết 13:22 ngày 01/10/2018

không cross domain kiểu này qua ajax được đâu bạn nhé. Trừ khi svr họ mở cho bạn.
Bạn phải làm hành đôngj này phía svr của bạn, code 1 file nodejs/c++/php hoặc bất cứ thứ gì để lấy dữ liệu từ server họ, ajax thực hiện request đến server của bạn, domain phải giống với nhau.

QC viết 13:16 ngày 01/10/2018

Lỗi này là do bên đó họ không có mở ‘Access-Control-Allow-Origin’ ở trong header nên trình duyệt tự động chặn request luôn. cách giải quyết thì bạn chỉ có thể viết code bên server-side để lấy bài nha

Nguyen Ca viết 13:19 ngày 01/10/2018

Dùng JSONP chắc được

null viết 13:17 ngày 01/10/2018

Không được đâu, response không đúng chuẩn jsonp.

NTC viết 13:19 ngày 01/10/2018

domain phải giống với nhau.

Có nghĩa là khác sub domain cũng không được phải không bạn, vì cái này mình request cùng server chỉ khác sub domain thôi http://dev.2dev4u.com/demo/index.html

Dark.Hades viết 13:20 ngày 01/10/2018

đúng rồi bạn, phải giống nhau.

NTC viết 13:07 ngày 01/10/2018

Ngoài cách dùng 1 proxy bằng nodejs/c++/php thì còn cách nào khác không bạn nhỉ

Dark.Hades viết 13:21 ngày 01/10/2018

Site đó có phải site của bạn không?
Nếu phải thì bạn bật header đó lên, còn không thì không có cách nào cả.

NTC viết 13:12 ngày 01/10/2018

Site đó là của mình nhưng mình đang tim hiểu xem có cách nào khác có thể request mà không cần config header không, site của mình thì mình có thể config.
Nhưng muốn get data từ trang khác mà cũng gặp trường hợp này thì không thể config header theo ý mình được
Cảm ơn nhưng chia sẻ của bạn

NTC viết 13:22 ngày 01/10/2018

Sure, I’m learning more about it. Thanks for your sharing.

null viết 13:22 ngày 01/10/2018

Còn 1 vấn đề là response từ http://api.2dev4u.com/json/posts không phải là JSON. Bạn cần thêm vào header Content-Type: application/json; charset=UTF-8. Việc này nhằm tránh lỗi phân tích JSON chứ không giải quyết được vấn đề CORS.

Nếu bạn dùng PHP thì giải pháp là cURL.
Nếu vẫn dùng JavaScript thì hầu như không có cách nào, có thể lách bằng CORS proxy, nhưng những dịch vụ như thế thường không ổn định. Ví dụ:

  • http://cors-proxy.htmldriven.com/ : Hiện tại còn dùng được nhưng không hỗ trợ SSL.
  • https://cors-anywhere.herokuapp.com/ : Chỉ dùng cho thử nghiệm, có nhiều hạn chế.
  • https://crossorigin.me/ : Khá nổi tiếng trước đây, giờ đã sập.
NTC viết 13:13 ngày 01/10/2018

Cái response đó không nhất thiết là JSON đâu bạn, mình muốn get toàn bộ trang giống như lúc bạn view-source lên ấy.
Như bạn mói thì mình cũng đã dùng cURL và đã khắc phục được lỗi này

Mình dùng Simple PHP Proxy thấy khá là hay, bạn có thể tham khảo http://benalman.com/code/projects/php-simple-proxy/examples/simple/

Mình cũng đã tìm hiểu được sơ sơ rồi.
Cảm ơn bạn

Bài liên quan
0