Can't get rack-cors working in rails application

I wanted to implement CORS in my rails application, so I googled rack-cors gem for it. And I did everything as was said in README, that is updated Gemfile accordingly and updated application.rb как это:

module YourApp
  class Application < Rails::Application

    # ...

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

  end
end

Но это не сработало. No matter what I did, in the browser console I kept getting message:
XMLHttpRequest cannot load https://somewebsite.com. Origin http://0.0.0.0:3000 is not allowed by Access-Control-Allow-Origin.

Прочитав этот пост и выпуски на github, я понял, что, возможно, положение промежуточного программного обеспечения для установки в стойку в стеке промежуточного программного обеспечения имеет значение. Поэтому я сделал, как было сказано в выпуске github:

module YourApp
  class Application < Rails::Application

    # ...

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

  end
end

После этого, когда я бегу rake middleware Rack-Cors действительно находится на вершине стека.
Но все равно просто не получится. Я продолжаю получать ту же ошибку. Кто-нибудь, пожалуйста, помогите.

5 ответов

Решение

Я столкнулся с той же проблемой с герокой. Я нашел этот блог с той же проблемой стеллажей.

Просто переместил use Rack::Cors в config.ruПередислоцировали к героку и все работает.

require ::File.expand_path('../config/environment',  __FILE__)
run Rails.application

require 'rack/cors'
use Rack::Cors do

  # allow all origins in development
  allow do
    origins '*'
    resource '*', 
        :headers => :any, 
        :methods => [:get, :post, :delete, :put, :options]
  end
end

Существует новая тема для решения проблемы с герою

Вместо того, чтобы использовать

config.middleware.use Rack::Cors do

пытаться

config.middleware.insert_before ActionDispatch::Static, Rack::Cors do

Это сработало для меня.

Вам просто нужно откомментировать гем Rack CORS в вашем Gemfile (gemfile.rb)

# gemfile.rb

gem 'rack-cors'

А затем запустите код ниже, чтобы установить гем

bundle install

А также убедитесь, что ваш инициализатор cors (cors.rb) установлен следующим образом# config / initializers / cors.rb

Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins '*'

    resource '*',
      headers: :any,
      methods: [:get, :post, :put, :patch, :delete, :options, :head]
  end
end

Установка исходных текстов на "*" должна быть приемлемой для разработки, но имейте в виду, что при развертывании в рабочей среде вы захотите изменить это значение, чтобы оно соответствовало URI вашего внешнего интерфейса по соображениям безопасности.

Надеюсь, это поможет.

Подчеркните этот ответ как полезный, если он поможет, или прокомментируйте ответ ниже для получения дополнительных разъяснений.

Я должен был создать специальный маршрут для обработки запросов опций, гем Cors не сделал это для меня, как я ожидал. Маршрут, который я добавил в конец route.rb, был:

  match "*path", :to => proc {|env| [200, {
  'Access-Control-Allow-Origin' => '*',
  'Access-Control-Allow-Methods' => 'GET, POST, PUT, DELETE, OPTIONS',
  'Access-Control-Allow-Credentials' => 'true',
  'Access-Control-Request-Method' => '*',
  'Access-Control-Allow-Headers' => 'Origin, X-Requested-With, Content-Type, Accept, Authorization',
'Content-Type' => 'text/plain'

 }, ["CORS Preflight"]] }, :via => [:options]

Ведь выяснилось, что у этого драгоценного камня есть некоторые проблемы с герокой, на локальной машине он работает отлично.

Убедитесь, что вы добавили или не комментировали gem 'rack-cors' в Gemfile

Другие вопросы по тегам