2013-07-25 9 views
77

के माध्यम से कुछ भी अनुमति दें मैं कोर को कैसे अक्षम कर सकता हूं? के लिए किसी कारण मैं जंगली अनुमति मूल और हेडर carded अभी तक अपने ajax अनुरोध अभी भी शिकायत है कि मूल मेरी CORS नीति द्वारा अनुमति नहीं थी ....सीओआरएस नीति

मेरे अनुप्रयोगों नियंत्रक:

class ApplicationController < ActionController::Base 
    protect_from_forgery 
    before_filter :current_user, :cors_preflight_check 
    after_filter :cors_set_access_control_headers 

# 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-Methods'] = 'POST, GET, OPTIONS' 
    headers['Access-Control-Allow-Headers'] = '*' 
    headers['Access-Control-Max-Age'] = "1728000" 
end 

# If this is a preflight OPTIONS request, then short-circuit the 
# request, return only the necessary headers and return an empty 
# text/plain. 

def cors_preflight_check 
    if request.method == :options 
    headers['Access-Control-Allow-Origin'] = '*' 
    headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS' 
    headers['Access-Control-Allow-Headers'] = '*' 
    headers['Access-Control-Max-Age'] = '1728000' 
    render :text => '', :content_type => 'text/plain' 
    end 
end 
    private 
    # get the user currently logged in 
    def current_user 
    @current_user ||= User.find(session[:user_id]) if session[:user_id] 
    end 
    helper_method :current_user 

end 

मार्गों:

match "*all" => "application#cors_preflight_check", :constraints => { :method => "OPTIONS" } 
    match "/alert" => "alerts#create" 
    match "/alerts" => "alerts#get" 
    match "/login" => "sessions#create" 
    match "/logout" => "sessions#destroy" 
    match "/register" => "users#create" 

संपादित करें ---

मैं भी करने की कोशिश की:

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

--edit 2 में

---

समस्या यह है कि क्रोम एक्सटेंशन CORS मुझे लगता है कि समर्थन नहीं कर सकते है। मैं सीओआरएस को छोड़कर जानकारी कैसे प्राप्त कर सकता हूं? मुझे प्रीफलाइट चेक का जवाब कैसे देना चाहिए?

+1

नहीं "अक्षम CORS" का उपयोग नहीं करते लेकिन प्रभावी रूप से कोई नीति नहीं हो सकती है? मैं किसी भी अनुरोध का जवाब नहीं दे सकता। – Nonconformist

+1

क्या आप इसे स्थानीयहोस्ट पर उपयोग करते हैं? – nXqd

उत्तर

127

मेरे पास सार्वजनिक एपीआई पर आपकी वही आवश्यकताएं हैं जिनके लिए मैंने रेल-एपीआई का उपयोग किया था।

मैंने पहले फ़िल्टर में हेडर भी सेट किया है। ऐसा लगता है:

headers['Access-Control-Allow-Origin'] = '*' 
headers['Access-Control-Allow-Methods'] = 'POST, PUT, DELETE, GET, OPTIONS' 
headers['Access-Control-Request-Method'] = '*' 
headers['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept, Authorization' 

ऐसा लगता है कि आप एक्सेस-कंट्रोल-अनुरोध-विधि शीर्षलेख को याद करते हैं।

+0

वाह क्या एक साधारण गलती है। धन्यवाद। – Nonconformist

+0

अजीब। यह काम कर रहा था और यह फिर से काम करना बंद कर दिया .... – Nonconformist

+0

यह अजीब बात है। क्या आप प्राप्त त्रुटि पर अधिक जानकारी प्रदान कर सकते हैं? – matteo

18

rack-cors मिडलवेयर पर एक नज़र डालें। यह एक कॉन्फ़िगर करने योग्य तरीके से सीओआरएस हेडर को संभालेगा।

+1

मैंने कोशिश की कि – Nonconformist

+2

हमने महीनों के लिए रैक-कॉर्स का उपयोग किया है और अब तक किसी भी मुद्दे को एनकआउट नहीं किया है। क्या आप सुनिश्चित हैं कि समस्या क्लाइंट-साइड पर नहीं रहती है? – Jef

+1

मुझे लगता है कि समस्या यह है कि क्रोम एक्सटेंशन CORS का समर्थन नहीं करते हैं, इसलिए उत्पत्ति शून्य है। मैं सीओआरएस को पूरी तरह अक्षम कैसे कर सकता हूं और किसी भी अनुरोध का जवाब दे सकता हूं जिसमें नल उत्पत्ति के साथ अनुरोध शामिल हैं? – Nonconformist

3

मुझे यह समस्या थी कि यह वेब ब्रोवर (मेरे मामले में क्रोम) कहां से सामने आया था, यह मुद्दा था।

आप क्रोम का उपयोग कर रहे हैं, तो यह इतना लांच करने का प्रयास:

विंडोज के लिए:

1) अपने डेस्कटॉप पर Chrome एक शॉर्टकट बनाएँ। शॉर्टकट पर राइट-क्लिक करें और गुण चुनें, फिर "शॉर्टकट" टैब पर स्विच करें।

2) "लक्ष्य" फ़ील्ड में, निम्न संलग्न: -Disable-वेब-सुरक्षा

-args मैक के लिए, एक टर्मिनल विंडो खोलें और कमांड लाइन से चलाएँ: खुला ~/अनुप्रयोग/गूगल \ Chrome.app/ से -Disable-वेब-सुरक्षा

-args जानकारी ऊपर:

http://documentumcookbook.wordpress.com/2012/03/13/disable-cross-domain-javascript-security-in-chrome-for-development/

+0

इसे क्यों वोट दिया गया है? मेरे पास प्रश्न में वर्णित एक जैसा स्थिति है जिसे वेब सुरक्षा अक्षम के साथ क्रोम चलाकर हल किया गया था। समस्या तब होती है जब आप स्थानीय रूप से विकास सर्वर चला रहे हैं।जाहिर है आप वेब सुरक्षा अक्षम हमेशा के साथ चल रहे क्रोम नहीं छोड़ेंगे। – klavado

+0

इस स्थिति को सही तरीके से समझाए जाने के बाद इसे वोट नहीं दिया जाना चाहिए :) – nXqd

+3

मैंने वोट-डाउन नहीं किया, लेकिन उत्तर से यह केवल विकास उद्देश्यों के लिए एक समाधान स्पष्ट नहीं है। हालांकि यह स्थानीय रूप से समस्या का समाधान कर सकता है, कोई भी आपके वेब आगंतुकों/एक्सटेंशन उपयोगकर्ताओं को यह करने की उम्मीद नहीं कर सकता है। तो मैं जवाब में स्पष्ट करता हूं। – nathanvda

3

मैं भी समस्या आई हो, विशेष रूप से क्रोम के साथ। आपने जो किया वह मेरे आवेदन में मैंने जो किया वह अनिवार्य रूप से दिखता है। केवल अंतर यह है कि मैं अपने मूल कोरस हेडर में एक सही होस्टनाम के साथ प्रतिक्रिया दे रहा हूं, न कि वाइल्डकार्ड। ऐसा लगता है कि क्रोम इस के साथ picky है।

विकास और उत्पादन के बीच स्विचिंग एक दर्द है, इसलिए मैंने यह छोटा कार्य लिखा जो मुझे विकास मोड में और उत्पादन मोड में भी मदद करता है। निम्नलिखित सभी चीजें मेरे application_controller.rb में तब तक होती हैं जब तक अन्यथा ध्यान न दिया जाए, यह शायद सबसे अच्छा समाधान नहीं हो सकता है, लेकिन rack-cors मेरे लिए काम नहीं करता है, मुझे याद नहीं है क्यों।

def add_cors_headers 
    origin = request.headers["Origin"] 
    unless (not origin.nil?) and (origin == "http://localhost" or origin.starts_with? "http://localhost:") 
    origin = "https://your.production-site.org" 
    end 
    headers['Access-Control-Allow-Origin'] = origin 
    headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS, PUT, DELETE' 
    allow_headers = request.headers["Access-Control-Request-Headers"] 
    if allow_headers.nil? 
    #shouldn't happen, but better be safe 
    allow_headers = 'Origin, Authorization, Accept, Content-Type' 
    end 
    headers['Access-Control-Allow-Headers'] = allow_headers 
    headers['Access-Control-Allow-Credentials'] = 'true' 
    headers['Access-Control-Max-Age'] = '1728000' 
end 

और फिर मैं अपने application_controller.rb में यह छोटी बात है, क्योंकि मेरी साइट लॉगिन करना आवश्यक है:

before_filter :add_cors_headers 
before_filter {authenticate_user! unless request.method == "OPTIONS"} 

मेरे routes.rb मैं भी इस बात की है:

match '*path', :controller => 'application', :action => 'empty', :constraints => {:method => "OPTIONS"} 

और इस विधि ऐसा लगता है:

def empty 
    render :nothing => true 
end 
+1

बस सर्कल को बंद करने के लिए। यह पूरी कॉरस गड़बड़ी तब होती है जब आप अपने उत्पादन बैक-एंड को स्थानीयहोस्ट एप्लिकेशन से मारते हैं, है ना? इनमें से कोई भी तब नहीं होगा जब सबकुछ उत्पादन में हो? – Sebastialonso

+2

केवल वही यूआरएल के तहत बैकएंड और वेबएप होस्ट किए जाते हैं। यदि वे पूरी तरह से दो अलग-अलग यूआरएल के तहत होस्ट किए जाते हैं, तो यह उत्पादन में भी होगा। –

+0

धन्यवाद क्रिस्टोफ। – Sebastialonso

-4

यह एक भी सबसे पीएचपी समर्थन चौखटे

Header set Access-Control-Allow-Methods "GET, POST, OPTIONS" 
Header set Access-Control-Allow-Origin "*" 
Header set Access-Control-Allow-Credentials true 
Header set Access-Control-Allow-Headers "accept, content-type, X-Requested-With, X-Prototype-Version, X-CSRF-Token, authorization" 

बस सुनिश्चित करें कि आप टिप्पणी करना ... httpd.conf फाइल में उत्पत्ति लाइन

# Virtual hosts 
#Header always set Access-Control-Allow-Origin "*" 
Include /private/etc/apache2/extra/httpd-vhosts.conf 

या आप कई मूल के साथ खत्म हो जाएगा " *, * " समस्या

-3

/config/application.rb पर कॉन्फ़िगरेशन आज़माएं:

config.middleware.insert_before 0, "Rack::Cors" do 
    allow do 
    origins '*' 
    resource '*', :headers => :any, :methods => [:get, :post, :options, :delete, :put, :patch], credentials: true 
    end 
end 
+0

आप उल्लेख करना भूल गए हैं कि देव को Gemfile –

3

, बस आप रैक CORS मणि जोड़ सकते हैं https://rubygems.org/gems/rack-cors/versions/0.4.0

1 कदम: अपने Gemfile को मणि जोड़ें:

gem 'rack-cors', :require => 'rack/cors' 

और फिर बचाने के लिए और चलाने के bundle install

2 कदम: इसे जोड़कर अपनी कॉन्फ़िगरेशन/application.rb फ़ाइल अपडेट करें:

config.middleware.insert_before 0, Rack::Cors do 
     allow do 
     origins '*' 
     resource '*', :headers => :any, :methods => [:get, :post, :options] 
     end 
    end 

अधिक जानकारी के लिए आप https://github.com/cyu/rack-cors specailly करने के लिए जाना यदि आप रेल 5.

+0

में 'रैक-कॉर्स' जोड़ना चाहिए यह निश्चित रूप से मेरी समस्या हल हो गई। धन्यवाद दोस्त –

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