2012-01-11 25 views
7

Tôi nhận được lỗi JavaScript nàyBất kỳ cách nào để vượt qua Access-Control-Allow-Origin để phát triển trên máy chủ của riêng tôi?

XMLHttpRequest không thể tải http://foo.bar.no/API/map_tools/clean_addresses/check. Xuất xứ http://foo.bar.no:9294 không được cho phép bởi Access-Control-Allow-Origin.

Đây là tất cả trên cùng một tên miền và cùng một máy chủ, nhưng dự án JavaScript của tôi đang được máy chủ độc lập tự động lưu trữ JavaScript và phụ thuộc vào một tệp.

Làm cách nào để vượt qua giới hạn này trong khi tôi đang phát triển?


Tôi đã thử cho phép tập lệnh máy chủ JavaScript của mình kết nối. Đây là kết quả của một curl đến url:

 
HTTP/1.1 200 OK 
Date: Wed, 11 Jan 2012 09:05:14 GMT 
Server: Apache/2.2.16 (Debian) 
Access-Control-Allow-Origin: http://foo.bar.no:9294 
Vary: Accept-Encoding 
Content-Length: 70 
Content-Type: text/plain 

array(1) { 
    ["q"]=> 
    string(31) "map_tools/clean_addresses/check" 
} 

Và tôi vẫn gặp lỗi chính xác như tôi đã dán ở trên. Tại sao Chrome vẫn từ chối kết nối với URL chết tiệt khi nó rõ ràng được phép !?

+0

Quy tắc xác định vi phạm Access-Control-Allow-Origin' khá nghiêm ngặt: bất kỳ sự khác biệt nào trước dấu gạch chéo đầu tiên, bao gồm cổng, giao thức (HTTP so với HTTPS) và miền phụ, sẽ ngăn chặn một yêu cầu AJAX truyền thống dựa trên XHR ([bài viết tốt] (http://encosia.com/using-cors-to-access-asp-net-services-across-domains/) vi Encosia) –

+0

Vâng tôi cảm nhận được điều đó. Có cách nào tôi có thể đặt trình duyệt của mình vào "Chế độ phát triển" hay thứ gì đó sẽ đóng% ¤ # @ trong khi tôi đang phát triển không? Bất kỳ trình duyệt Windows nào cũng sẽ làm – Hubro

+0

Bạn sẽ sử dụng JSONP hoặc proxy để yêu cầu các url miền khác. Bài báo đề xuất một phương án thay thế bằng cách sử dụng tiêu chuẩn CORS để bỏ qua nó. –

Trả lời

2

OK I figured it out. Tôi đã tìm kiếm một bản sửa lỗi đơn giản và nhanh chóng vì tôi chỉ cần các yêu cầu miền chéo cho các mục đích phát triển. Hóa ra tôi chỉ cần đặt cả hai số

header("Access-Control-Allow-Origin: http://foo.bar.no:9294"); 
header("Access-Control-Allow-Credentials: true"); 

Trong tập lệnh PHP của tôi trên Apache. Sau đó, trong mã JavaScript tôi:

# Set jQuery ajax to use 'withCredentials' globally 
$.ajaxSetup({ 
    xhrFields: { 
     withCredentials: true 
    } 
}); 

Và đó đã làm các trick

1

Sử dụng khả năng proxy ngược của máy chủ web của bạn để proxy http://foo.bar.no/API/map_tools/clean_addresses/check đến http://foo.bar.no:9294/API/map_tools/clean_addresses/check.

Vì vậy, khi bạn sử dụng Apache, bạn nên thêm một cái gì đó giống như

<Proxy *> 
      Order allow,deny 
      allow from all 
    </Proxy> 

    ProxyPass /API/map_tools/ http://foo.bar.no:9294/API/map_tools/ 
    ProxyPassReverse /API/map_tools/ http://foo.bar.no:9294/API/map_tools/ 

để vhost cấu hình của bạn

+0

Tôi không hiểu gì về điều đó, xin lỗi – Hubro

+0

Bạn sử dụng máy chủ web nào để phát triển? –

+0

Máy chủ 80: Apache, nhưng: 9294 là tập lệnh nút – Hubro

1

Bạn có thể khắc phục hạn chế bảo mật an ninh cross-domain trong chrome bằng cách bắt đầu nó với cờ --disable-web-an ninh.

Ví dụ: (trên OS X):

open /Applications/Google\ Chrome.app/ --args --disable-web-security 
+1

Tôi mất một lúc để làm việc này. Quá trình Chrome trên Windows dường như không muốn chết, ngay cả sau khi tôi từ chối Chrome chạy ngầm. Miễn là các quy trình đang chạy, bắt đầu thực thi Chrome chỉ mở ra một cửa sổ mới trong các quy trình hiện có, do đó, thao tác này chỉ hoạt động sau khi tắt Chrome hoàn toàn bằng trình quản lý tác vụ. Điều này cũng có nghĩa là tôi đã mất tất cả các tab đang mở ... Menu "Đã đóng gần đây" thậm chí đã biến mất. – Hubro

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