Jak mogę wyłączyć cors? Z jakiegoś powodu zaznaczyłem dozwolone źródła i nagłówki, ale moje żądania Ajax wciąż narzekają, że pochodzenie nie było dozwolone przez moje zasady CORS ...
Kontroler moich aplikacji:
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
trasy:
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"
Edytować---
Próbowałem też:
config.middleware.use Rack::Cors do
allow do
origins '*'
resource '*',
:headers => :any,
:methods => [:get, :post, :delete, :put, :options]
end
end
w application.rb
--edyt 2 ---
Problem polega na tym, że rozszerzenia Chrome mogą nie obsługiwać CORS. Jak mogę pobrać informacje z pominięciem CORS? Jak mam odpowiedzieć na kontrolę przed lotem?
ruby-on-rails
cors
Nonkonformista
źródło
źródło
Odpowiedzi:
Mam te same wymagania co do publicznego API, dla którego użyłem rails-api.
Ustawiłem również nagłówek w filtrze przed. To wygląda tak:
Wygląda na to, że przegapiłeś nagłówek Access-Control-Request-Method.
źródło
Przyjrzyj się oprogramowaniu pośredniczącemu rack-cors . Będzie obsługiwać nagłówki CORS w konfigurowalny sposób.
źródło
Po prostu możesz dodać gem rack-cors https://rubygems.org/gems/rack-cors/versions/0.4.0
1. krok: dodaj klejnot do swojego Gemfile:
a następnie zapisz i uruchom
bundle install
Drugi krok: zaktualizuj plik config / application.rb, dodając to:
Aby uzyskać więcej informacji, przejdź do https://github.com/cyu/rack-cors Specailly, jeśli nie używasz szyn 5.
źródło
.insert_before 0
było ważne. Wcześniej korzystałemconfig.middleware.use
i działało to tylko do momentu, gdy chciałem zezwolić na CORS dla mojegopublic
katalogu.Miałem problemy, zwłaszcza z Chrome. To, co zrobiłeś, wygląda zasadniczo tak, jak ja w mojej aplikacji. Jedyną różnicą jest to, że odpowiadam poprawnymi nazwami hostów w nagłówkach Origin CORS, a nie symbolem wieloznacznym. Wydaje mi się, że Chrome jest w tym wybredny.
Przełączanie się między programowaniem a produkcją jest uciążliwe, więc napisałem tę małą funkcję, która pomaga mi w trybie programistycznym, a także w trybie produkcyjnym. Wszystkie poniższe rzeczy dzieją się w moim,
application_controller.rb
chyba że zaznaczono inaczej, to może nie jest najlepsze rozwiązanie, ale dla mnie też nie działały rack-cors , nie pamiętam dlaczego.A potem mam w sobie tę małą rzecz,
application_controller.rb
ponieważ moja witryna wymaga logowania:W moim
routes.rb
mam też to:a ta metoda wygląda tak:
źródło
Miałem podobny problem wcześniej, gdzie okazało się, że przyczyną był przeglądarka internetowa (w moim przypadku Chrome).
Jeśli używasz Chrome, spróbuj go uruchomić, więc:
Dla Windowsa:
1) Utwórz skrót do Chrome na pulpicie. Kliknij skrót prawym przyciskiem myszy i wybierz Właściwości, a następnie przejdź do zakładki „Skrót”.
2) W polu „Target” dodaj: –args –disable-web-security
W przypadku komputerów Mac otwórz okno terminala i uruchom je z wiersza poleceń: otwórz ~ / Applications / Google \ Chrome.app/ –args –disable-web-security
Powyższe informacje z:
http://documentumcookbook.wordpress.com/2012/03/13/disable-cross-domain-javascript-security-in-chrome-for-development/
źródło
Właśnie napotkałem ten problem w mojej aplikacji szynowej w produkcji. Wiele odpowiedzi tutaj dało mi wskazówki i pomogło mi w końcu dojść do odpowiedzi, która działała dobrze.
Używam Nginx i wystarczyło zmodyfikować plik my_app.conf (gdzie my_app to nazwa twojej aplikacji). Możesz znaleźć ten plik w
/etc/nginx/conf.d
Jeśli jeszcze tego nie
location / {}
zrobiłeś, możesz po prostu dodać go podserver {}
, a następnie dodaćadd_header 'Access-Control-Allow-Origin' '*';
podlocation / {}
.Ostateczny format powinien wyglądać mniej więcej tak:
źródło
Wypróbuj konfigurację w /config/application.rb:
źródło