Wie kann ich cors deaktivieren? Aus irgendeinem Grund habe ich die zulässigen Ursprünge und Überschriften mit einem Wildcard versehen, aber meine Ajax-Anfragen beschweren sich immer noch, dass der Ursprung nach meiner CORS-Richtlinie nicht zulässig war.
Mein Anwendungscontroller:
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
Routen:
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"
Bearbeiten---
Ich habe auch versucht:
config.middleware.use Rack::Cors do
allow do
origins '*'
resource '*',
:headers => :any,
:methods => [:get, :post, :delete, :put, :options]
end
end
in application.rb
--edit 2 ---
Das Problem ist, dass Chrome Extensions CORS möglicherweise nicht unterstützen, denke ich. Wie kann ich Informationen unter Umgehung von CORS abrufen? Wie soll ich auf den Preflight-Check reagieren?
ruby-on-rails
cors
Nonkonformist
quelle
quelle
Antworten:
Ich habe dieselben Anforderungen an eine öffentliche API, für die ich Rails-API verwendet habe.
Ich habe auch den Header in einem Vorfilter gesetzt. Es sieht aus wie das:
Anscheinend haben Sie den Header Access-Control-Request-Method verpasst.
quelle
Schauen Sie sich die Rack-Cors- Middleware an. CORS-Header werden konfigurierbar behandelt.
quelle
Sie können einfach das Rack-Cors-Juwel https://rubygems.org/gems/rack-cors/versions/0.4.0 hinzufügen
1. Schritt: Fügen Sie Ihrem Gemfile einen Edelstein hinzu:
und dann speichern und ausführen
bundle install
2. Schritt: Aktualisieren Sie Ihre Datei config / application.rb, indem Sie Folgendes hinzufügen:
Weitere Informationen finden Sie unter https://github.com/cyu/rack-cors. Insbesondere, wenn Sie keine Schienen verwenden. 5.
quelle
.insert_before 0
war das wichtig. Vorher habe ich verwendetconfig.middleware.use
und das hat nur funktioniert, bis ich CORS für meinpublic
Verzeichnis zulassen wollte .Ich hatte Probleme, insbesondere auch mit Chrome. Was Sie getan haben, sieht im Wesentlichen so aus, wie ich es in meiner Bewerbung getan habe. Der einzige Unterschied besteht darin, dass ich in meinen Origin CORS-Headern mit einem korrekten Hostnamen und nicht mit einem Platzhalter antworte. Es scheint mir, dass Chrome damit wählerisch ist.
Das Umschalten zwischen Entwicklung und Produktion ist ein Schmerz, deshalb habe ich diese kleine Funktion geschrieben, die mir im Entwicklungsmodus und auch im Produktionsmodus hilft. Alle folgenden Dinge passieren in meinem,
application_controller.rb
wenn nicht anders angegeben, es ist vielleicht nicht die beste Lösung, aber Rack-Cors haben auch bei mir nicht funktioniert, ich kann mich nicht erinnern warum.Und dann habe ich dieses kleine Ding in meinem,
application_controller.rb
weil meine Seite ein Login erfordert:In meinem habe
routes.rb
ich auch dieses Ding:und diese Methode sieht so aus:
quelle
Ich hatte zuvor ein ähnliches Problem, bei dem sich herausstellte, dass der Webbrowser (in meinem Fall Chrom) das Problem war.
Wenn Sie Chrome verwenden, starten Sie es wie folgt:
Für Windows:
1) Erstellen Sie eine Verknüpfung zu Chrome auf Ihrem Desktop. Klicken Sie mit der rechten Maustaste auf die Verknüpfung, wählen Sie Eigenschaften und wechseln Sie dann zur Registerkarte "Verknüpfung".
2) Fügen Sie im Feld "Ziel" Folgendes hinzu: –args –disable-web-security
Öffnen Sie für Mac ein Terminalfenster und führen Sie dieses über die Befehlszeile aus: Öffnen Sie ~ / Applications / Google \ Chrome.app/ –args –disable-web-security
Oben Infos von:
http://documentumcookbook.wordpress.com/2012/03/13/disable-cross-domain-javascript-security-in-chrome-for-development/
quelle
Ich bin gerade auf dieses Problem in meiner Schienenanwendung in der Produktion gestoßen. Viele Antworten hier gaben mir Hinweise und halfen mir, endlich zu einer Antwort zu kommen, die für mich gut funktionierte.
Ich arbeite mit Nginx und es war einfach genug, nur die ändern my_app.conf Datei (wo my_app Ihr App - Name ist). Sie finden diese Datei in
/etc/nginx/conf.d
Wenn Sie es noch nicht getan haben
location / {}
, können Sie es einfach unter hinzufügenserver {}
und dannadd_header 'Access-Control-Allow-Origin' '*';
unter hinzufügenlocation / {}
.Das endgültige Format sollte ungefähr so aussehen:
quelle
Versuchen Sie die Konfiguration unter /config/application.rb:
quelle