2009-03-20 35 views
47

Tôi cần phải tạm thời cho phép XMLHttpRequest miền chéo. Thay đổi cài đặt bảo mật firefox có vẻ là cách để đi. Nhưng tôi đã thử với thisthis nhưng chúng không hoạt động. Có ai đã có thể cấu hình này trước đây? Cảm ơn.Cài đặt Firefox để bật yêu cầu ajax miền chéo

+0

Nếu bạn có thể yêu cầu thay đổi cài đặt bảo mật của Firefox, bạn có thể sử dụng tập lệnh GreaseMonkey không? –

+1

Hãy dùng thử trên Chrome: http://stackoverflow.com/questions/3102819/disable-same-origin-policy-in-chrome – AgA

+0

Hãy thử Firefox của tôi để bật miền chéo với ajax tại đây: https: // addons. mozilla.org/en-US/firefox/addon/cross-domain-cors/ –

Trả lời

21

Đối với các trình duyệt hiện đại, bạn có thể thử các phương pháp sau đây:

https://developer.mozilla.org/en/HTTP_access_control

Nói tóm lại, bạn cần phải thêm đoạn mã sau vào tiêu đề phản ứng SERVER (sau đây cho phép truy cập từfoo.example):

Access-Control-Allow-Origin: http://foo.example 
Access-Control-Allow-Methods: POST, GET, OPTIONS 
Access-Control-Allow-Headers: X-PINGOTHER 
Access-Control-Max-Age: 1728000 

Lưu ý rằng X-PINGOTHER là tiêu đề tùy chỉnh được chèn bởi JavaScript và phải khác với trang web để ngồi e.

Nếu bạn muốn bất kỳ trang web nào truy cập máy chủ của mình bằng Ajax, hãy sử dụng * để thay thế.


Edit:

Khi tôi lần đầu tiên trả lời câu hỏi bằng cách , tôi thực sự đánh cùng một vấn đề, và tôi đã làm việc xung quanh nó bằng cách sử dụng cấu hình phía máy chủ.

Không có plugin nào trên FF hoặc Chrome lúc đó.

Tuy nhiên, bây giờ chúng tôi có giải pháp thay thế sử dụng plugin phía trình duyệt, hãy kiểm tra các câu trả lời của tsds

+1

Đây là một tài nguyên tuyệt vời: http://enable-cors.org/ – Booker

+4

nếu tôi hiểu chính xác, điều này không giải quyết được vấn đề ban đầu nếu bạn không thể thay đổi máy chủ – Aras

+1

Lưu ý rằng 'Access-Control-Allow-Origin: * 'sẽ không hoạt động nếu bạn cũng muốn sử dụng tùy chọn' withCredentials' của XHR để gửi các tiêu đề cookie cùng. Bạn cần chỉ định một miền cụ thể trong trường hợp đó. – dmkc

9

Bạn đã thử sử dụng yêu cầu ajax của jQuery chưa? Kể từ phiên bản 1.3 jQuery hỗ trợ một số loại yêu cầu ajax miền chéo nhất định.

Trích dẫn từ tài liệu tham khảo trên:

Lưu ý: Tất cả từ xa (không trên cùng một miền ) yêu cầu nên được chỉ định như GET khi 'kịch bản' hoặc 'jsonp' là datatype (vì nó tải tập lệnh bằng cách sử dụng thẻ tập lệnh DOM). Các tùy chọn Ajax yêu cầu đối tượng XMLHttpRequest không có sẵn cho các yêu cầu này. Các chức năng đầy đủ và thành công là được gọi là hoàn thành, nhưng không nhận được đối tượng XHR; beforeSend và chức năng dataFilter không được gọi là .

Tính đến jQuery 1.2, bạn có thể tải JSON dữ liệu nằm trên tên miền khác nếu bạn định một callback JSONP, có thể được thực hiện như vậy: "? Myurl callback =". jQuery tự động thay thế? với tên phương thức chính xác để gọi, gọi lại cuộc gọi được chỉ định của bạn. Hoặc, nếu bạn đặt kiểu dữ liệu thành "jsonp", gọi lại sẽ được tự động thêm vào yêu cầu Ajax của bạn.

+0

chúng tôi đang sử dụng tính năng này để truy xuất dữ liệu json, nhưng đây là html được tích hợp trong trang và nó chỉ là tạm thời, vì vậy việc thay đổi cấu hình firefox phải là điều đơn giản nhất để làm – Pablote

+2

Tại sao lại là downvote? Sử dụng khả năng miền chéo của khung là một câu trả lời hợp lý cho câu hỏi này. Thực tế là HTML đã được yêu cầu không được đề cập trong câu hỏi, chỉ trong bình luận để trả lời của tôi. – tvanfosson

2

Tôi đã thử sử dụng điều 'UniversalBrowswerRead' đó và nó không hoạt động. Bạn có thể thêm tiêu đề 'cho phép', nhưng tôi chưa thực sự cố gắng thực hiện nó. Nó khá mới.

Bạn có thể tìm thêm thông tin here

1

gì về việc sử dụng một cái gì đó giống như mod_proxy? Sau đó, nó trông vào trình duyệt của bạn như các yêu cầu đang đi đến cùng một máy chủ, nhưng chúng thực sự đang được chuyển tiếp đến một máy chủ khác.

7

Đây là điều, không có cách nào để "tạm thời" vô hiệu hóa tên miền chéo XMLHttpRequest, nếu bạn có thể vô hiệu hóa nó tạm thời sau đó nó có thể được vô hiệu hóa vĩnh viễn. Đây là một vấn đề khá phổ biến trong lập trình AJAX hiện đại và thường được giải quyết bằng cách sử dụng kỹ thuật được gọi là kịch bản tên miền chéo.

Ý tưởng ở đây là nếu bạn gọi ra một tập lệnh tên miền chéo, nó trả về các kết quả JavaScript (JSON) sau đó được truyền vào một hàm ở cuối của bạn.

Dưới đây là một số mẫu mã để minh họa làm thế nào nó có thể nhìn từ một mã quan điểm JavaScript:

function request_some_data() { 
    var s = "http://my.document.url.com/my_data?p1=v1&p2=v2&callback=myfunc"; 

     try { 
     try{ 
      document.write("<scr"+"ipt type='text/javascript' src='"+s+"'></scr"+"ipt>"); 
     } 
     catch(e){ 
      var x = document.createElement("script"); 
      x.src = s; 
      document.getElementsByTagName("head")[0].appendChild(x); 
     } 
     } 
     catch (e) { 
     alert(e.message); 
     } 
    } 

Sau đó bạn sẽ định nghĩa một hàm trong mã của bạn mà nhận dữ liệu và máy chủ bạn "xử lý" các trường hợp gọi lại, đây là client-side JavaScript:

function myfunc(data) { 
    alert(data); 
} 

Và ở phía máy chủ, ở đây tôi đưa ra một ví dụ PHP nhưng điều này có thể được thực hiện chỉ một cách dễ dàng trong Java hoặc những gì chưa từng server-side của bạn công nghệ là:

<?php 
    if($_GET["callback"]) { 
    print($_GET["callback"] . "("); 
    } 
    /* place your JSON object code/logic here */ 
    if($_GET["callback"]) { 
    print(");"); 
    } 
?> 

Lưu ý rằng những gì bạn đang tạo ở phía máy chủ sẽ trở thành một số JavaScript được thực thi ở phía máy khách.

+16

'"

+4

Tất nhiên bạn có thể tắt tạm thời. Ví dụ: khởi động Chrome bằng --disable-web-security. –

+0

@JosephLust xin lưu ý rằng điều này đã được hỏi/trả lời một chút trước khi Chrom sử dụng rộng rãi. – Michael

2

Tôi đang phải đối mặt với điều này từ file://. Tôi muốn gửi các truy vấn đến hai máy chủ từ một tệp HTML cục bộ (một testbed).

Trường hợp cụ thể này không phải là mối quan tâm về an toàn, nhưng chỉ Safari cho phép điều này.

Đây là số best discussion Tôi đã tìm thấy sự cố.

+0

Cảm ơn! Tôi đoán tôi sẽ không được thử nghiệm trong Chrome nữa. – tomdemuyt

1

Tôi đã sử dụng Fiddler làm proxy. Fiddler chuyển hướng cuộc gọi cục bộ đến máy chủ bên ngoài.

Tôi đã định cấu hình Firefox để sử dụng proxy thủ công (127.0.0.1 cổng 8888). Fiddler nắm bắt các cuộc gọi và chuyển hướng chúng đến một máy chủ khác, bằng cách sử dụng các bộ lọc URL.

28

Nếu bạn không muốn lãng phí thời gian của mình đối với các vấn đề tên miền chéo trong quá trình phát triển và thử nghiệm ứng dụng của mình, bạn có thể sử dụng addon Force CORS cho FF.

CẬP NHẬT: Dường như chương trình bổ trợ này không còn tồn tại. Nhưng có một tùy chọn khác - điều này Chrome extension

+9

Forcecors là rất tốt. Đáng nói rằng sau khi cài đặt, bạn phải kích vào view => toolbars => add-on bar. Sau đó, nút cors sẽ hiển thị ở phía dưới bên phải bấm vào đó để kích hoạt nó. Tôi giải nén xpi và thấy có một chức năng chuyển đổi khi một nút đã được đẩy nhưng không bao giờ nhìn thấy nút. – HMR

+5

"Đáng nói rằng sau khi cài đặt bạn phải bấm vào xem => thanh công cụ => add-on bar." Bạn, thưa bạn, là một vị thánh – NcAdams

+6

Có vẻ như FF đã xóa nó. – shashwat

-1

Chỉnh sửa thủ công cài đặt của Firefox là cách để thực hiện, nhưng thật bất tiện khi bạn cần thực hiện thường xuyên.

Thay vào đó, bạn có thể cài đặt tiện ích bổ sung sẽ làm điều đó cho bạn bằng một cú nhấp chuột.

Tôi sử dụng CORS everywhere, hoạt động tốt cho tôi.

Đây là a link to the installer

+0

Câu trả lời rằng chỉ liên kết đến các tài nguyên khác thường được coi là xấu, vì chúng có thể thay đổi kịp thời. Vui lòng thêm phần có liên quan nhất vào chính câu trả lời. – Qirel

0

Để cho phép tên miền chéo:

  1. nhập about:config
  2. chấp nhận phải cẩn thận
  3. nhập security.fileuri.strict_origin_policy vào thanh tìm kiếm
  4. thay đổi false

Bây giờ bạn có thể đóng tab. Thông thường bạn có thể thực hiện yêu cầu miền chéo với cấu hình này.

Xem here để biết thêm chi tiết.

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