#ruby-on-rails #ajax #cors #preflight
Вопрос:
Контекст: У нас есть приложение Rails и несколько запросов ajax. Похоже (или, по крайней мере, я пришел к такому выводу), что у нас есть клиенты из компании, у которой есть какой-то веб-фильтр, который заставляет некоторые запросы запускать запрос ПАРАМЕТРОВ перед полетом. Мы получаем некоторые журналы ошибок, связанные с этим.
Я не смог воспроизвести точную ситуацию, так как я действительно не знаю конфигурацию корпоративной сети/браузеров клиентов. Однако мне удалось воспроизвести нечто очень похожее. (В разработке) для того, чтобы запустить предварительный запрос, я просто добавил прослушиватель onprogress к одному из запросов POST, которые вызывают такого рода ошибки, и изменил путь на localhost:3000 при вводе с 0.0.0.0:3000, поэтому браузер считает, что он из другого источника (также для запуска предварительного запроса я временно отключил любые проверки подлинности, которые это могло вызвать).
Теперь на моем сервере я обрабатываю запросы ПАРАМЕТРОВ и добавляю некоторые заголовки (основываясь на том, что я мог найти вокруг ЭТОГО). Примечание: Я пробовал различные комбинации этого кода, такие как прямая установка » * «для значений» Источник разрешения на доступ «и меньше» Заголовки разрешений на доступ».
def add_option_request_headers headers['Access-Control-Allow-Origin'] = request.headers['Origin'] || '*' headers['Access-Control-Allow-Methods'] = 'GET, POST, PUT, DELETE, OPTIONS' headers['Access-Control-Allow-Headers'] = 'Content-Type, Authorization, Origin, Content-Length, Accept, ' request.headers['Access-Control-Request-Headers'].to_s headers['Access-Control-Allow-Credentials'] = 'true' end
Просмотр журналов сервера и браузера и вкладка «Сеть» (я использую firefox) Я вижу, что запрос ОПЦИЙ выполнен успешно, и запрос POST (сделанный через ajax) выполнен успешно (я проверил, что он входит в действие).
Однако:
- консоль показывает ошибку CORS, что, я думаю, нормально, потому что я специально принудил CORS, но я подозреваю, что мои клиенты тоже могут ее получить из-за этой штуки с веб-фильтром.
- Самая запутанная часть заключается в том, что запускается обработчик ошибок ajax (несмотря на успешные запросы), и объект, переданный обработчику в качестве аргумента, имеет
status: 404
иstatusText: "error"
(я прикрепил довольно избыточную фотографию отладчика, остановленного для проверки ошибки).
Ни в журнале сервера, ни на вкладке «Сеть браузера» нет никаких следов ошибки 404. Эта ошибка 404-это то, что мы получаем в производстве, и причина, по которой мы изучаем это.
Сообщение отправлено правильно, и я считаю, что клиенты на самом деле не видят и не воспринимают вообще никаких проблем, но этот журнал ошибок все равно отправляется.
Примечание: У нас та же проблема и с запросами GET, а не только с сообщениями.
Обновление: Я заметил, что, хотя сообщение успешно отправлено, ответ на самом деле не получен клиентом (обработчик успеха ajax не вызывается, только обработчик ошибок). Поэтому я предполагаю, что где-то мне не хватает какого-то заголовка, и браузер не доверяет запросу CORS.
Обновление 2: Мне удалось заставить его работать, также установив заголовки в запросе на публикацию. Я не понимаю, зачем мне нужно было устанавливать их в почтовом запросе, если я уже установил их в предполетном режиме. Означает ли это, что мне нужно обрабатывать это для каждого запроса post в случае, если сеть какого-либо клиента запускает предполетную подготовку?
Комментарии:
1. какую версию rails вы используете?
2. Ruby 1.9.3, Rails 3.2