2013-06-25 41 views
6

Tôi có hai ứng dụng riêng biệt, một ứng dụng ember và một ứng dụng đường ray trên cùng một máy chủ. Ngay bây giờ, tôi đang thử nghiệm cục bộ.Yêu cầu ứng dụng Ember cho ứng dụng Rails - Cross Domain?

Yêu cầu Ember của tôi không được chuyển sang đường ray (localhost: 3000). Tôi dường như không thể tìm ra nếu điều đó xảy ra bởi vì nó nghĩ rằng đó là một yêu cầu tên miền chéo. Nó sẽ được coi là một yêu cầu tên miền chéo, mặc dù chúng ở trên cùng một máy chủ? Nếu vậy, có cách nào để tránh yêu cầu miền chéo này vì chúng nằm trên cùng một máy chủ mà không ảnh hưởng đến bảo mật? Hay tôi cần phải gắn bó với JSONP?

Trả lời

7

Có, yêu cầu đến một cổng khác là yêu cầu tên miền chéo. Trình duyệt đang thực hiện yêu cầu OPTIONS preflight (CORS) và không nhận được câu trả lời. Đó là sau đó thả yêu cầu ban đầu. Bạn cần phải có máy chủ đáp ứng với các tiêu đề CORS thích hợp để yêu cầu OPTIONS này. Trình duyệt sau đó sẽ thực hiện yêu cầu orignal.

Đây là more information on CORS.

Đây là mã từ bộ điều khiển ứng dụng của tôi:

class V1::ApplicationController < ApplicationController 
after_filter :cors_set_access_control_headers, :log_user 

# respond to options requests with blank text/plain as per spec 
def cors_preflight_check 
    logger.info ">>> responding to CORS request" 
    render :text => '', :content_type => 'text/plain' 
end 

# For all responses in this controller, return the CORS access control headers. 
def cors_set_access_control_headers 
    headers['Access-Control-Allow-Origin'] = '*' 
    headers['Access-Control-Allow-Headers'] = 'X-AUTH-TOKEN, X-API-VERSION, X-Requested-With, Content-Type, Accept, Origin' 
    headers['Access-Control-Allow-Methods'] = 'POST, GET, PUT, DELETE, OPTIONS' 
    headers['Access-Control-Max-Age'] = "1728000" 
end 

Và từ tuyến đường.rb:

match '/*path' => 'application#cors_preflight_check', :via => :options 

Ngoài ra còn có một plugin giá có thể xử lý này: rack-cors

+1

Tôi đang sử dụng 'rack-cors' nhưng một lần nữa, khi chạy một yêu cầu máy chủ đường ray của tôi không hiển thị bất cứ điều gì. Các yêu cầu Cross-Domain có hiển thị trên máy chủ Rails hay không và sau đó bị từ chối hoặc AJAX có từ chối chúng trước khi chúng được gửi không? – darksky

+0

Điểm 'cors' nếu' AJAX' chặn các yêu cầu miền chéo trước khi chúng được gửi đi là gì? – darksky

+0

AJAX luôn gửi yêu cầu OPTIONS trước chuyến bay cho các yêu cầu miền chéo. Một số công cụ gỡ lỗi trình duyệt không hiển thị điều này. Tôi không thể làm việc rak-cors nên tôi đã thực hiện yêu cầu OPTIONS xử lý bản thân mình. – buuda

0

Bạn không nói những gì nền tảng bạn đang chạy trên, nhưng giải pháp tốt nhất cho các loại hình điều Ive tìm thấy là băng

https://github.com/metajack/tape

này sẽ cho phép bạn thiết lập một chút reverse proxy - và ánh xạ url tới ứng dụng đường ray của bạn, trong khi phục vụ JS của bạn.

Các cổng khác nhau, được coi là các miền khác nhau bởi hộp cát bảo mật, do đó bạn sẽ cần proxy ngược lại, nếu bạn đang phục vụ ember và đường ray riêng biệt.

+0

môi trường địa phương của tôi là OS X nhưng tôi sẽ được triển khai trên Linux. Tôi sẽ xem xét điều đó. Trả lời câu hỏi của bạn, mỗi ứng dụng được phân phát riêng. – darksky

0

Tôi đoán bạn có một vài tùy chọn tùy nếu ứng dụng của bạn đang chạy trong phát triển hoặc phương thức sản xuất, điều này là:

chế độ Phát triển chỉ

  • Nếu bạn đang sử dụng chrome hoặc chromium như trình duyệt phát triển của bạn, bạn có thể bắt đầu bằng cờ --args --disable-web-security

chế độ và Phát triển sản xuất

  • Sử dụng jsonp như bạn đã đề cập
  • Thêm vào cấu hình máy chủ của bạn Cross-Origin Tiêu đề yêu cầu Access-Control-Allow-Origin: * kể từ khi bạn đang sử dụng đường ray có một cái nhìn here.
  • Phục vụ của ứng dụng của bạn theo cùng một cảng miền & chỉ variing trên con đường http://myhost.com/app1, http://myhost.com/app2, vv

Hy vọng nó giúp.