2012-08-27 25 views
12

Tôi đang cố gắng để có được một số AJAX làm việc giữa hai tên miền phụ.CORS được kích hoạt trong Apache, nhưng AJAX không hoạt động (chrome cho biết nguồn gốc không được phép)

rails.mydomain.com và mydomain.com

Trong apache, trong/etc/apache2/sites-available/Tôi có tập tin rails.mydomain.com tôi:

<VirtualHost *:80> 
    Header add Access-Control-Allow-Origin "http://www.mydomain.com" 
    Header add Access-Control-Allow-Origin "http://www.dev-mydomain.com" 
</VirtualHost> 

Tuy nhiên, bất cứ khi nào tôi cố gắng thực hiện yêu cầu thử nghiệm ajax đơn giản từ http://www.dev-mydomain.com, trong Chrome tôi nhận được: "XMLHttpRequest không thể tải http://rails.mydomain.com/directory. Không được phép truy cập http://www.dev-mydomain.com bởi Access-Control-Allow-Origin".

Bất kỳ ai biết tôi đang thiếu gì?

+1

Kiểm tra [Access-C ontrol-Allow-Origin nhiều miền gốc] (http://stackoverflow.com/questions/1653308/access-control-allow-origin-multiple-origin-domains) –

+1

Ok, vì vậy tôi đã thấy bài đăng đó trước đây, nhưng tôi đã theo dõi phản hồi về việc thực hiện hai câu lệnh "Header add". Tôi đã xóa câu lệnh bổ sung thứ hai và chỉ có một bộ Tiêu đề và nó hoạt động, tuy nhiên, cuối cùng tôi sẽ cần có hai nguồn ... tôi chỉ cần làm hai câu lệnh hoặc giải pháp từ bài đăng đó là phương pháp tốt nhất –

+0

yup , nó thèm ra với nhiều hơn một thiết lập. google cần sửa lỗi này càng sớm càng tốt. họ đã không phát minh ra ajax ngay từ đầu sao? –

Trả lời

0

Tôi đã sử dụng rack-cors để một số thành công, khá đơn giản để thêm khi thực hiện nguồn gốc ajax chéo ...

2

Bạn có thể thử này xin vui lòng?

Để Gemfile

gem "rack-cors", "~> 0.2.7" 

Để config/application.rb

config.middleware.use Rack::Cors do |requests| 
    requests.allow do |allow| 
    allow.origins '*' 
    allow.resource '*', headers: :any, methods: [:get, :post, :put, :delete, :options] 
    end 
end 

Đừng quên máy chủ khởi động lại. Sau đó, nó sẽ được làm việc.

+1

Điều này không làm cho máy chủ kém an toàn hơn. – mindmyweb

3

Khi liên kết của Dahazer chỉ ra, đặt cược tốt nhất là đặt một tiêu đề Access-Control-Allow-Origin duy nhất. Nó chắc chắn không thích hợp cho sản xuất, nhưng bạn chỉ có thể phản hồi tiêu đề Origin trong khi ở chế độ dev.

Nếu bạn vẫn gặp sự cố, có thể bạn không đặt đủ tiêu đề CORS trong phản hồi. Theo kinh nghiệm của tôi về làm ajax tên miền chéo trong chrome, (không sử dụng jquery tâm), tôi cũng đã cần thiết để thiết lập các tiêu đề sau đây:

Access-Control-Allow-Headers : X-Requested-With,Content-Type 

Cho tôi đã sử dụng phương thức HTTP khác hơn là POST và GET nó cũng là cần thiết cho tôi để đặt

Access-Control-Allow-Methods : GET,PUT,POST,DELETE 

Tuy nhiên, trên tất cả, tôi khuyên bạn nên đọc hướng dẫn html5 CORS, đặc biệt là phần CORS on the server. Nó sẽ cho bạn một ý tưởng tốt về các cách khác nhau để cấu hình CORS, có thể là trên máy chủ hoặc máy khách (trong trường hợp tùy chọn cấu hình ajax của jquery), dựa trên trường hợp sử dụng cụ thể của bạn.

2

Gần đây, tôi gặp sự cố này. Tôi đã đặt Access-Control-Allow-Origin thành * trong Apache. Tuy nhiên, Chrome vẫn đang chặn các yêu cầu miền chéo của tôi, trong khi Chrome hoạt động tốt trong Firefox.

Giải pháp phù hợp với tôi là thêm tiêu đề Access-Control-Allow-Methods với giá trị OPTIONS, GET, POST. Đăng bài này ở đây, trong trường hợp bất kỳ ai có cùng một vấn đề trong tương lai và không có giải pháp nào khác hoạt động.

0

Sự cố có thể ở 4 địa điểm khác nhau tại đây. Hãy bắt đầu với định nghĩa <virthualhost của bạn. Đầu tiên, có một vài mô-đun và cấu hình cài đặt bạn cần phải thậm chí cho phép định nghĩa vhost của bạn để thực hiện các cài đặt này.

  • Đảm bảo mod_headers được kích hoạt
  • Đảm bảo tập tin cấu hình apache chính của bạn có một thiết lập cho phép AllowOverride vhosts của bạn để ghi đè mặc định CORS bạn cài đặt

Sau khi bạn đã thực hiện tất cả những người, bạn có thể sử dụng cài đặt Access-Control-Allow-Origin, miễn là bạn cũng sử dụng chỉ thị DocumentRoot

<VirtualHost *:80> 
    DocumentRoot /server/path/to/site/root 
    Header add Access-Control-Allow-Origin "mydomain.com" 
    Header add Access-Control-Allow-Origin "dev-mydomain.com" 
    Header set Access-Control-Allow-Methods "GET,POST,PUT,OPTIONS" 
</VirtualHost> 
Các vấn đề liên quan