Comment puis-je désactiver cors? Pour une raison quelconque, joker les origines et les en-têtes autorisés, mais mes demandes ajax se plaignent toujours que l'origine ne soit pas autorisée par la politique de la SCRO ....
Mon contrôleur d'applications:
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
itinéraires:
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"
Modifier---
J'ai aussi essayé:
config.middleware.use Rack::Cors do
allow do
origins '*'
resource '*',
:headers => :any,
:methods => [:get, :post, :delete, :put, :options]
end
end
dans application.rb
- edit 2 ---
Le problème est que Chrome Les extensions risquent de ne pas prendre en charge CORS, je pense. Comment puis-je récupérer des informations en contournant CORS? Comment dois-je répondre à la vérification du contrôle en amont?
J'ai vos mêmes exigences sur une API publique pour laquelle j'ai utilisé Rails-api.
J'ai également placé l'en-tête dans un filtre avant. Cela ressemble à ceci:
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'
Il semble que vous ayez oublié l'en-tête Access-Control-Request-Method.
Jetez un coup d'œil au middleware rack-cors . Il traitera les en-têtes CORS de manière configurable.
Vous pouvez simplement ajouter un bijou de rack-cors https://rubygems.org/gems/rack-cors/versions/0.4.
1ère étape: ajouter une gemme à votre Gemfile:
gem 'rack-cors', :require => 'rack/cors'
puis enregistrez et exécutez bundle install
2ème étape: mettez à jour votre fichier config/application.rb en ajoutant ceci:
config.middleware.insert_before 0, Rack::Cors do
allow do
origins '*'
resource '*', :headers => :any, :methods => [:get, :post, :options]
end
end
pour plus de détails, vous pouvez aller à https://github.com/cyu/rack-cors Précisé si vous n'utilisez pas Rails 5.
J'ai eu des problèmes, en particulier avec Chrome également. Ce que vous avez fait ressemble en gros à ce que j'ai fait dans mon application. La seule différence est que je réponds avec un nom d'hôte correct dans mes en-têtes Origin CORS et Il ne me semble pas que Chrome est difficile avec cela.
Basculer entre le développement et la production est une tâche difficile, alors j’ai écrit cette petite fonction qui m’aide en mode développement et également en mode production. Toutes les choses suivantes se produisent dans mon application_controller.rb
sauf indication contraire, ce n'est peut-être pas la meilleure solution, mais rack-cors n'a pas fonctionné pour moi non plus, je ne me souviens plus pourquoi.
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
Et puis j'ai cette petite chose dans mon application_controller.rb
parce que mon site nécessite un identifiant:
before_filter :add_cors_headers
before_filter {authenticate_user! unless request.method == "OPTIONS"}
Dans mon routes.rb
J'ai aussi cette chose:
match '*path', :controller => 'application', :action => 'empty', :constraints => {:method => "OPTIONS"}
et cette méthode ressemble à ceci:
def empty
render :nothing => true
end
J'ai eu un problème similaire auparavant où il s'est avéré que c'était le navigateur Web (chrome dans mon cas) qui était la question.
Si vous utilisez chrome, essayez de le lancer de la manière suivante:
Pour les fenêtres:
1) Créez un raccourci vers Chrome sur votre bureau. Cliquez avec le bouton droit de la souris sur le raccourci, choisissez Propriétés, puis passez à l’onglet “Raccourci”.
2) Dans le champ "Cible", ajoutez ce qui suit: –args –disable-web-security
Pour Mac, ouvrez une fenêtre de terminal et exécutez-la à partir de la ligne de commande: ouvrez ~/Applications/Google\Chrome.app/ –args –disable-web-security
Informations ci-dessus de:
Je viens de rencontrer ce problème dans mon Rails en production. Beaucoup de réponses ici m'ont donné des indices et m'ont aidé à arriver enfin à une réponse qui a bien fonctionné pour moi.
J'utilise Nginx et il était assez simple de modifier simplement le fichier my_app.conf (où my_app est le nom de votre application). Vous pouvez trouver ce fichier dans /etc/nginx/conf.d
Si vous n'avez pas location / {}
vous pouvez déjà l’ajouter sous server {}
, puis ajouter add_header 'Access-Control-Allow-Origin' '*';
sous location / {}
.
Le format final devrait ressembler à ceci:
server {
server_name ...;
listen ...;
root ...;
location / {
add_header 'Access-Control-Allow-Origin' '*';
}
}