2010-03-29 7 views
34

Tôi đã viết một ứng dụng đường ray nhỏ để phân phát nội dung cho một trang web khác thông qua xmlhttprequests sẽ hoạt động từ một tên miền khác (sẽ không thể chạy chúng trên cùng một máy chủ). Tôi hiểu rằng tôi sẽ cần đặt quyền truy cập cho phép kiểm soát truy cập trên máy chủ đường ray của mình để cho phép trang web yêu cầu truy cập tài liệu này.Làm cách nào để đặt quyền truy cập cho phép kiểm soát quyền truy cập trong webrick dưới đường ray?

Có vẻ như đã được ghi lại khá tốt về cách thực hiện điều này với Apache và đây có lẽ là máy chủ tôi sẽ sử dụng khi triển khai trang web. Trong khi tôi đang phát triển mặc dù tôi hy vọng sẽ chỉ sử dụng webrick như tôi đã từng làm với đường ray. Có cách nào để cấu hình webrick để cung cấp tiêu đề http thích hợp trong đường ray không?

+0

"quyền truy cập-cho phép-nguồn gốc" là gì? để hiểu webrick tốt hơn một chút, tôi thấy đây là một khởi đầu tốt đẹp: http://microjet.ath.cx/webrickguide/html/What_is_WEBrick.html – poseid

+0

Đó là tiêu đề http cho trình duyệt biết rằng bạn có thể truy cập tài nguyên từ máy chủ đó nếu có trang yêu cầu là từ một tên miền khác. – brad

Trả lời

12

Nếu bạn đang sử dụng Rails 2, hãy thêm điều này vào ứng dụng của bạn.

before_filter :set_access 

def set_access 
    @response.headers["Access-Control-Allow-Origin"] = "*" 
end 

Rõ ràng thay đổi "*" thành thứ gì đó ít cởi mở hơn sẽ là một ý tưởng hay.

+0

Chà, bạn kéo câu hỏi đó ra khỏi ruột của lịch sử. Cảm ơn (thật không may là tôi đã từ bỏ dự án đó vì những lý do khác một thời gian trước đây nhưng điều này rất hữu ích khi có) – brad

+4

và trên đường ray 3? – macool

+3

có lẽ là đường ray 4? sửa: đường ray 4 dưới đây;) http://stackoverflow.com/a/17815546/845717 – BradGreens

8

Rails 2.3.8

before_filter :allow_cross_domain_access 
def allow_cross_domain_access 
    response.headers["Access-Control-Allow-Origin"] = "*" 
    response.headers["Access-Control-Allow-Methods"] = "*" 
end 
14

Rails 3,1

class ApplicationController < ActionController::Base 
    protect_from_forgery 
    after_filter :set_access_control_headers 

    def set_access_control_headers 
    headers['Access-Control-Allow-Origin'] = '*' 
    headers['Access-Control-Request-Method'] = '*' 
    end 
end 
77

Rails 4 (http://edgeguides.rubyonrails.org/security.html#default-headers)

Trong config/application.rb:

config.action_dispatch.default_headers.merge!({ 
    'Access-Control-Allow-Origin' => '*', 
    'Access-Control-Request-Method' => '*' 
}) 
+6

+1 Lưu ý rằng đoạn mã trên cũng loại bỏ các tiêu đề mặc định hiện có (X-Frame-Options, X-XSS-Protection, X-Content-Type-Options) –

+0

@DanielRikowski Vì vậy, không có vấn đề gì nếu chúng ta chỉ cần thêm các tiêu đề mặc định đó trở lại danh sách, phải không? – Noz

+0

@Noz: Đúng vậy. Hoặc bằng cách thêm chúng vào băm hoặc bằng cách kết hợp các tiêu đề bổ sung ở trên. –

12

Rails 3.1 - sử dụng một bộ điều khiển after_filter không làm việc cho tôi vì vậy tôi bổ sung thêm một trung gian tùy chỉnh thay vì:

Trong ứng dụng/middleware/cors_middleware.rb:

# For icons to work in Firefox with CDN 
class CorsMiddleware 
    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    status, headers, body = @app.call(env) 
    cors_headers = headers.merge({ 
     'Access-Control-Allow-Origin' => '*', 
     'Access-Control-Request-Method' => '*'   
    }) 
    [status, cors_headers, body] 
    end 
end 

Trong config/application.rb:

require File.join(Rails.root, "app", "middleware", "cors_middleware") 
config.middleware.insert_before ActionDispatch::Static, CorsMiddleware # Need it early in the chain to work for assets