Rob Bikmansurov bio photo

Rob Bikmansurov

I enjoy playing basketball and running, I'm a CIO in an average universal bank, I'm software developer (RubyOnRails, Python, VB). I like to create information systems and programs and try something new

Email Twitter Github Gitlab

Появилась необходиимость делать запросы с одного домена в другой, например, дергаете API другого домена? Используете при этом Content-Type: application/json?

Поздравляю! Пора изучить CORS - Cross-Origin Resource Sharing, кросс-доменные запросы.

Стандарт CORS различает “простые” и “сложные” запросы. Простым считается запрос методами HEAD, GET, POST и заголовками: Accept, Accept-Language, Content-Language, Last-Event-ID, Content-Type, но только со значениями: application/x-www-form-urlencoded, multipart/form-data, text/plain

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

Заголовок ответа Access-Control-Allow-Origin сообащает, с какого домена разрешено запрашивать данные. Это может быть как веб-адрес, так и знак *, если разрешено всем. Несколько адресов через запятую не поддерживается.

Клиент сначала сделает запрос OPTIONS (preflight request), на который сервер должен ответить какие методы и заголовки он принимает.

В моем rails-backend (на домене api.test.example.ru) для настройки CORS используется gem rack-cors, вот его настройки в config/initializers/cors.rb:

module ApiRails
  class Application < Rails::Application
    config.middleware.insert_before 0, Rack::Cors do
      allow do
        origins /lk.test.example.ru\z/
         resource '*',
          headers: :any,
          methods: %i(get post delete options),
          expose: ['access-token', 'expiry', 'token-type', 'uid', 'Authorization'],
          max_age: 600
      end
    end
  end
end

Для проверки можно использовать команду: curl -v -H "Origin: https://lk.test.example.ru" https://api.test.example.ru.