Хорошо, поэтому я попытался применить приведенные выше предложения, и я нашел решение своей проблемы.
Я проверил, что это работает, проверив вызовы web и api по моим URL-адресам и суб-URL с помощью ибез защиты CSRF.
Просто пояснение к моему предыдущему комментарию.Чтобы быть более точным, порядок, в котором я создавал субмиксы, не имел значения, но, конечно, я тогда следовал правильному порядку, когда записывал строки для обработки каждого пути.
Итак, порядок важен.
Это то, что я сделал (только биты кода).
Я использовал goji в качестве маршрутизатора и gorilla / csrf для защиты csrf.
ПРИМЕЧАНИЕ: я не сделалвключите весь мой код, но только самые важные части, чтобы описать то, что я сделал.
1) Я создал мультиплексирование, используя
mux := goji.NewMux()
2), так как мои API обслуживаются по URL "/api "и связанных под URL, я создал Submux для api
apiMux := goji.SubMux()
3) Я назначил страницы, которые соответствуют пути" / api "и" / api * "этому subMux
Обратите внимание, что я НЕ включил какую-либо защиту csrf
mux.Handle(pat.New("/api/*"), apiMux)
mux.Handle(pat.New("/api"), apiMux)
4) Я создал Submux для веб-страниц моего сайта
webMux := goji.SubMux()
5) Я назначил страницы, которые соответствуютПуть "/" и "/ *" к этому subMux
Обратите внимание, что здесь, в моем коде, я связал промежуточное ПО для защиты csrf
mux.Handle(pat.New("/"), csrf.Protect(csrfKey, csrf.Secure(true))(webMux))
mux.Handle(pat.New("/*"), csrf.Protect(csrfKey, csrf.Secure(true))(webMux))
6) Для моего удобства я создал другоеSubMuxes для обработки других путей, таких как "/ users", "/ users / 1", "/ users / addform".Этот шаг важен: я назначил этот «userMux» для webMux, а не для основного mux, созданного на шаге 1.
Таким образом, защита csrf наследуется.Пример:
usersMux := goji.SubMux()
webMux.Handle(pat.New("/users/*"), usersMux)
webMux.Handle(pat.New("/users"), usersMux)
В двух словах, это было решением моей проблемы:
I) Я назначил этот "apiMux" основному мультиплексору, созданному на шаге 1.
Я не назначил его никаким другим мультиплексорам.Я НЕ назначил его webMux, который обрабатывает корневые URL "/" и "/ *"
II). Порядок важен, поэтому я реализовал код для URL-адресов API, а затем код для веба.urls
Надеюсь, это поможет.И больше всего я надеюсь, что объяснение было ясным ... (если не просто дайте мне знать).Спасибо, что указал мне правильное направление