Появилась необходиимость делать запросы с одного домена в другой, например, дергаете 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
.