2013-07-05 23 views
6

Hy vọng rằng ai đó có thể giúp tôi giải quyết vấn đề sau trong khi phát triển một ứng dụng di động trong điện thoại. Tôi đang cố gắng đọc các bài đăng từ cài đặt wordpress nhưng tôi gặp phải lỗi này khi tôi chạy trang index.html trên chromeLỗi Truy cập-Kiểm soát-Cho phép-Xuất xứ khi nhận các bài đăng Wordpress trong ứng dụng Phonegap

XMLHttpRequest không thể tải Gốc null không được Access-Control-Allow-Origin cho phép.

Tôi đã cài đặt plugin JSON-API trong wordpress và khi tôi điều hướng đến trang tôi muốn tôi có thể xem nó ok. Mã của tôi là như sau:

<!DOCTYPE HTML> 
<html> 
<header> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script> 
    <script> 
    function readSinglePost (url,target_div) { 
     var URL = url//+"&callback=?"; 
      console.log(URL); 
      jQuery.ajax({ 
       url: URL, 
       dataType: 'json', 
       success: function(data) { 
       console.log(data); 
       jQuery(target_div).append("<h1>"+data.post.title+"</h1>"); 
       jQuery(target_div).append(data.post.content);jQuery(target_div). 
       append("<small>"+data.post.date+"</small>"); 
       console.log(data.post.content); 
      } 
     }); 
    } 
    jQuery(document).ready(function() { 
     var url = "http://www.example.com/api/get_post/?json=get_post&dev=1&id=5486"; 
     var target_div = "#contents"; 

     readSinglePost(url, target_div); 
    }); 
</script> 
</header> 
<body> 
<div id="main"> 
    <div id="title"></div> 
</div> 
</body> 
</html> 

CẬP NHẬT Để đối phó với Jamie dưới

Yêu cầu Raw

GET /api/get_post/?json=get_post&dev=1&id=5486 HTTP/1.1 
Host: www.example.com 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0 
Accept: application/json, text/javascript, */*; q=0.01 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
DNT: 1 
Origin: null 
Connection: keep-alive 

liệu đáp ứng

HTTP/1.1 200 OK 
Date: Fri, 05 Jul 2013 16:51:49 GMT 
Server: Apache/2.2.11 (Unix) 
Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma: no-cache 
X-Pingback: http://www.example.com/xmlrpc.php 
Set-Cookie: PHPSESSID=f6308c2732752bbb1149b345018bdf68; path=/ 
Set-Cookie: wc_session_cookie_a111a960a9b29354988b3de48943ad50=IRhSF41ZHIBHMA3mmCCSSjdOSxqXf2wj%7C%7C1373215910%7C%7C1373212310%7C%7Cd472ed970a72ba78e8b2c836a1d8b2cc; expires=Sun, 07-Jul-2013 16:51:50 GMT; path=/; httponly 
Set-Cookie: woocommerce_items_in_cart=0; expires=Fri, 05-Jul-2013 15:51:50 GMT; path=/ 
Set-Cookie: woocommerce_cart_hash=0; expires=Fri, 05-Jul-2013 15:51:50 GMT; path=/ 
Keep-Alive: timeout=15, max=100 
Connection: Keep-Alive 
Content-Type: text/plain; charset: UTF-8 
Content-Length: 57602 

Trả lời

12

Vì vậy, vấn đề mà bạn đang gặp phải thường được gọi là Bảo vệ nguồn gốc chéo. Về cơ bản, hầu hết các trình duyệt web sẽ không cho phép bạn lấy nội dung từ các máy chủ bên ngoài máy chủ của bạn, trừ khi máy chủ nói rằng nó là ok. Để thực hiện việc này, máy chủ cần xem một số có thể chấp nhận được Access-Control-Allow-Origin trong tiêu đề.

Tin tốt là điều này khá dễ sửa, như Bowdenweb chỉ ra trong How to Enable cors in WordPress.

Bạn chỉ cần để thêm tiêu đề phù hợp với tập tin headers.php, như vậy

<?php /** @package WordPress @subpackage Default_Theme **/ 
header("Access-Control-Allow-Origin: *"); 
?> 
<!DOCTYPE html> 

Cập nhật 1

Như ILI chỉ ra, có một plugin cho Wordpress gọi WordPress-Cross-Domain-Plugin mà giải quyết này vấn đề cho anh ta.

+0

Hi Jamie, nhờ trả lời của bạn. Tôi đã dán mã bạn đề xuất vào đầu tệp header.php của tôi trong chủ đề mà tôi đang sử dụng nhưng tôi vẫn gặp sự cố tương tự, bất kỳ ý tưởng nào? – ILI

+0

Tôi khuyên bạn nên lấy một bản sao của [Fiddler2] (http://fiddler2.com/) cho Windows.Điều này sẽ hoạt động như một proxy và cho phép bạn kiểm tra tất cả lưu lượng truy cập web. Sau đó, bạn có thể xem tất cả các yêu cầu và phản hồi, điều này có khả năng sẽ cho phép bạn cung cấp thông tin bổ sung. –

+0

Hi Jamie, tôi đã có một cái nhìn với Fiddler2 và không có gì rõ ràng xuất hiện tiếc là vẫn nhận được lỗi. – ILI

3

Trình duyệt không cho phép gọi qua nhiều tên miền trong ajax theo mặc định. Jamie Starke cho bạn câu trả lời. Có thể thử sử dụng $.support.cors = true; với JQuery. Dù sao, ứng dụng Phonegap có thể thực hiện yêu cầu miền chéo ajax. Nếu bạn không thể, hãy kiểm tra config.xml http://docs.phonegap.com/en/edge/guide_whitelist_index.md.html

+3

thử '' – guillaumeb

0

Những người vẫn gặp sự cố với Access-Control-Allow-Origin mặc dù đã đặt ký tự đại diện cho tệp config.xml của họ có thể muốn kiểm tra điều này nếu họ đang sử dụng Jellybean. Từ những gì tôi có thể thu thập nó là cố định trong phiên bản mới nhất của phonegap nhưng cài đặt phiên bản mới nhất vượt quá tài năng giới hạn của tôi!

đọc này: Phonegap/Cordova App breaks in Jelly Bean - Access-Control-Allow-Origin and setAllowUniversalAccessFromFileURLs

1
in plist file add 

<key>NSAppTransportSecurity</key> 


<dict> 
    <key>NSExceptionDomains</key> 
     <dict> 
      <key>yourdominename.com</key> 
        <dict> 
         <!--Include to allow subdomains--> 
         <key>NSIncludesSubdomains</key> 
         <true/> 
         <!--Include to allow HTTP requests--> 
         <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> 
         <true/> 
         <!--Include to specify minimum TLS version--> 
         <key>NSTemporaryExceptionMinimumTLSVersion</key> 
         <string>TLSv1.1</string> 
       </dict> 
      </dict> 
</dict> 

trong tập tin cấu hình

<preference name="BackupWebStorage" value="none" /> 
Các vấn đề liên quan