Добавление HTTP-заголовков в плагин в разработке

Ситуация:

Разрабатываю плагин и использую nginx как обратный прокси к rails:3000 — всё работает отлично, но возникают проблемы с доступом к API из-за надоедливых ошибок CORS, которые мы все хорошо знаем и «любим».

Доступ к XMLHttpRequest по адресу 'blah blah blah' из источника 'foo bar bing' заблокирован политикой CORS: в запрошенном ресурсе отсутствует заголовок 'Access-Control-Allow-Origin'.

На данный момент я пробовал добавлять заголовки в nginx, но по какой-то причине эти заголовки не отображаются при отладке в Chrome.

Также пытался использовать nginx для изменения proxy_headers из rails в nginx, но это тоже не помогло.

Кроме того, пробовал использовать расширение Chrome для вставки заголовков, но и это не сработало, хотя тестирование CORS в браузере с помощью специализированного сайта показало, что всё разрешено.

Затем попытался добавить gem rack-cors, но не смог настроить config.middleware из-за ошибки freeze.

Это блокирует разработку, и, кажется, я уперся в тупик :frowning:

Есть ли способ добавить эти заголовки напрямую в Discourse через файл конфигурации (или, что ещё лучше, в плагине), чтобы отправлять различные HTTP-заголовки, которые мы хотим протестировать и отправлять в среде разработки?

Или возможно заставить работать gem rack-cors? Если да, то где именно в плагине нужно добавить код?

Ссылка: RubyDoc.info: File: README – Documentation for rack-cors (0.4.0) – RubyDoc.info

Как уже упоминалось, все (многочисленные) попытки, описанные выше и в rubydocs, заканчиваются тем, что «ничего не происходит» — всё как обычно.

Даже пробовал временно забыть о CORS и просто добавить один заголовок HTTP-кэширования, но и это привело к тупику с моей стороны.

Думаю, все смеются над этими проблемами, связанными с CORS, включая меня; но если вы поделитесь, как добавить свои тестовые заголовки (CORS или нет) в среде разработки, это было бы очень кстати.

Спасибо.

Есть ли какая-то причина, по которой наша стандартная поддержка CORS и параметр сайта cors_origins не работают для вас?

Привет @sam

Не знаю, почему встроенная поддержка CORS не работает у меня, но я пробовал множество записей, включая такие записи с подстановочными знаками. Возможно, я делаю что-то не так?

Извините, я забыл упомянуть об этом в первом посте…

Возможно, мне нужно настроить эту переменную окружения?

  if env['REQUEST_METHOD'] == ('OPTIONS') && env['HTTP_ACCESS_CONTROL_REQUEST_METHOD']
    return [200, Discourse::Cors.apply_headers(cors_origins, env, {}), []]
  end

Мне нужно установить какие-то переменные окружения? Если да, то где? Возможно, это моя ошибка?

Спасибо!

Кстати, я установил это в инициализаторе плагина:

Discourse.SiteSettings.discourse_enable_cors = true;
Discourse.SiteSettings.discourse_cors_origin = "*";

и console.log показывает, что эти настройки в порядке… но в консоли всё ещё остаётся пресловутая ошибка «access denied» :frowning: