config CORS в Gorilla Mux

Я работаю в проекте golang, используя gorilla/mux в качестве маршрутизатора, и теперь у меня проблемы, связанные с CORS: я не могу сделать POST запрос, используя ajax в другом приложении.

Моя текущая конфигурация маршрутизатора выглядит следующим образом:

r := mux.NewRouter()
    r.HandleFunc("/", handleHome)
    //Other routes

    headersOk := handlers.AllowedHeaders([]string{"*"})
    originsOk := handlers.AllowedOrigins([]string{"*"})
    methodsOk := handlers.AllowedMethods([]string{"GET", "HEAD", "POST", "PUT", "OPTIONS"})

    // Start http server
    port := fmt.Sprintf(":%d", some_Port)
    http.ListenAndServe(port, handlers.CORS(originsOk, headersOk, methodsOk)(r))

Я использую:

"github.com/gorilla/mux"
"github.com/gorilla/handlers"

Сообщение, которое я получаю в браузере (на испанском языке):

Запрашивайте блокировку другого происхождения: la política de mismo origen impide leer el recurso remoto en https://miURL (razón: falta la cabecera CORS 'Access-Control-Allow-Origin').

На английском: в основном сервер отклоняет запрос, потому что отсутствует заголовок CORS.

Итак, что я сделал не так в настройках роутера?

ИЗМЕНИТЬ:

Запрос отправлен


person Sredny M Casanova    schedule 30.08.2017    source источник
comment
Можете ли вы показать заголовки ответа, как они видны в консоли Chrome?   -  person captncraig    schedule 30.08.2017
comment
@captncraig, конечно! просто добавлю в конце поста   -  person Sredny M Casanova    schedule 30.08.2017
comment
Похоже, вы тоже обслуживаете через кэдди? У Caddy есть собственный плагин cors, если это проще, но я думаю, что ваша проблема заключается в том, что прокси-сервер Caddy не пропускает заголовки.   -  person captncraig    schedule 30.08.2017
comment
@captncraig да, я использую Caddy. Но на этом сервере у меня есть другие API, и они отлично работают. Должна быть определенная конфигурация для сайта?   -  person Sredny M Casanova    schedule 30.08.2017
comment
Я считаю, что caddy ограничивает, какие заголовки передаются между клиентом и серверной частью. См. документацию по прокси.   -  person captncraig    schedule 30.08.2017
comment
Глядя на источник, я не уверен, пропускает ли он заголовки cors или нет. Можете ли вы получить доступ к приложению напрямую, без кэдди, и посмотреть, работает ли оно?   -  person captncraig    schedule 30.08.2017
comment
@captncraig хорошо, позвольте мне проверить, работает ли прямой доступ   -  person Sredny M Casanova    schedule 30.08.2017
comment
@captncraig нет, ничего. Хуже всего то, что не отправляется ни один заголовок   -  person Sredny M Casanova    schedule 30.08.2017
comment
На изображении показано, что вы получаете 403 Forbidden for the CORS preflight OPTIONS запрос на отправку браузером. developer.mozilla.org/en-US/docs/Web/ HTTP/. Это указывает на то, что сервер требует аутентификации для запросов OPTIONS. Этого не должно быть. Пока сервер требует аутентификации для запросов OPTIONS, запросы между источниками, которые вы пытаетесь сделать из внешнего кода, не смогут работать. Сервер ожидает заголовок авторизации в каждом запросе? Если это так, браузер не отправляет авторизацию в ВАРИАНТАХ предварительной проверки.   -  person sideshowbarker    schedule 31.08.2017
comment
Я думаю, что единственная причина, по которой вы видите это сообщение об отсутствующем Access-Control-Allow-Origin, заключается в том, что сервер отправляет этот заголовок только в ответах об успешном завершении, но не отправляет его в ответах об ошибках, таких как ответ 403, который вы ' повторно добраться до запроса OPTIONS. Но если вы настроите сервер так, чтобы он отправлял 200 OK или 204 для ответов на запросы OPTIONS, то, я думаю, вы получите заголовок Access-Control-Allow-Origin в этом ответе, как и ожидалось.   -  person sideshowbarker    schedule 31.08.2017
comment
Было бы полезно, если бы вы использовали stackoverflow.com/posts/45967591/edit для редактирования/обновления вашего вопроса, чтобы добавить код внешнего интерфейса. вы используете, чтобы сделать запрос. Потому что с вашим кодом запроса есть по крайней мере одна проблема: этот код, похоже, добавляет заголовок Access-Control-Allow-Origin к запросу. Но этот заголовок строго является заголовком response для отправки серверами. Добавление его в запросы просто сломает ситуацию. Во-первых, добавление этого вызовет предварительную проверку CORS.   -  person sideshowbarker    schedule 31.08.2017
comment
Ваш код запроса также, кажется, добавляет заголовок osn. Таким образом, даже когда вы удаляете Access-Control-Allow-Origin из запроса, этот заголовок osn также будет вызывать предварительный запрос OPTIONS. Поэтому, если вы хотите запретить браузеру выполнять эти ВАРИАНТЫ предварительной проверки, вы можете сделать это, не добавляя заголовок osn из запроса (наряду с не добавляя заголовок Access-Control-Allow-Origin в запрос).   -  person sideshowbarker    schedule 31.08.2017
comment
@sideshowbarker правильно, у меня есть этот заголовок, но он нужен мне в бэкэнде. Я не публикую код фронта, потому что у меня есть общий класс для отправки всех запросов, и опубликовать весь этот код здесь несложно. Тем не менее, я могу сказать, что он работает, чтобы сделать POST-запрос к другим API, которые размещены на том же сервере, потому что я уже проверил это.   -  person Sredny M Casanova    schedule 31.08.2017
comment
У меня была аналогичная проблема. Я решил использовать rs/cors. Я сделал простую настройку, следуя коду на вкладке «Параметры».   -  person AndreaM16    schedule 01.09.2017
comment
@AndreaM16 совершенно правильно! Я сделал это, и это сработало   -  person Sredny M Casanova    schedule 03.09.2017