2010-03-29 6 views
34

मैंने xmlhttprequests के माध्यम से किसी अन्य साइट पर सामग्री को सेवा देने के लिए एक छोटी रेल ऐप लिखा है जो किसी अन्य डोमेन से परिचालन करेगा (उन्हें उसी सर्वर पर चलाना संभव नहीं होगा)। मैं समझता हूं कि अनुरोध करने वाले वेब पेज को इस सामग्री तक पहुंचने के लिए मुझे अपने रेल सर्वर पर एक्सेस-कंट्रोल-अनुमति-मूल सेट करने की आवश्यकता होगी।रेल के नीचे हथियार में अभिगम-नियंत्रण-अनुमति-मूल कैसे सेट करें?

ऐसा लगता है कि यह अपाचे के साथ ऐसा करने के लिए काफी अच्छी तरह से प्रलेखित है और संभवतः यह सर्वर है जिसे मैं साइट पर तैनात करने के बाद उपयोग करूंगा। जबकि मैं विकास कर रहा हूं हालांकि मुझे केवल ब्रब्र का उपयोग करने की उम्मीद है क्योंकि मुझे रेल के साथ काम करने के लिए उपयोग किया जाता है। रेल के भीतर उपयुक्त http शीर्षलेख प्रदान करने के लिए Webrick को कॉन्फ़िगर करने का कोई तरीका है?

+0

"पहुंच-नियंत्रण-अनुमति-उत्पत्ति" क्या हैं? समझने के लिए थोड़ा बेहतर समझने के लिए मुझे यह एक अच्छी शुरुआत मिली: http://microjet.ath.cx/webrickguide/html/What_is_WEBrick.html – poseid

+0

यह एक http हैडर जो ब्राउज़र को बताता है कि उस सर्वर से संसाधनों का उपयोग करना ठीक है अगर अनुरोध पृष्ठ एक अलग डोमेन से है। – brad

उत्तर

12

यदि आप रेल 2 पर हैं तो बस इसे अपने आवेदन contoller में जोड़ें।

before_filter :set_access 

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

जाहिर है एक छोटे से कम खुले कुछ करने के लिए "*" बदलते एक अच्छा विचार होगा।

+0

वाह, आपने इतिहास के आंतों से उस सवाल को खींच लिया। धन्यवाद (दुर्भाग्यवश मैंने कुछ कारणों से अन्य कारणों से उस परियोजना को त्याग दिया लेकिन यह वहां उपयोगी है) – brad

+4

और रेल 3 पर? – macool

+3

शायद रेल 4? संपादित करें: रेल 4 नीचे है;) http://stackoverflow.com/a/17815546/845717 – BradGreens

8

रेल 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

रेल 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

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

config/application.rb में:

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

+1 ध्यान रखें कि उपरोक्त कोड मौजूदा डिफ़ॉल्ट शीर्षलेख (एक्स-फ़्रेम-विकल्प, एक्स-एक्सएसएस-प्रोटेक्शन, एक्स-कंटेंट-टाइप-ऑप्शन) –

+0

@DanielRikowski को भी हटा देता है, इसलिए यदि हम बस उन डिफ़ॉल्ट शीर्षकों को जोड़ते हैं तो यह कोई समस्या नहीं है सूची में वापस, सही? – Noz

+0

@Noz: यह सही है। या तो उन्हें हैश में जोड़कर या ऊपर दिए गए अतिरिक्त शीर्षलेखों में विलय करके। –

12

रेल 3.1 - का उपयोग करते हुए/Application.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 

config में:

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 
6

एक नियंत्रक after_filter मेरे लिए काम नहीं किया तो मैं इसके बजाय कस्टम मिडलवेयर कहा:

एप्लिकेशन/मिडलवेयर/cors_middleware.rb में यदि आप रैक मिडलवेयर मणि के रूप में समाधान चाहते हैं: https://github.com/cyu/rack-cors

संबंधित मुद्दे