ルーターをオーバーライドしたくない場合(これをサポートするようにアプリを構成していない場合、またはルートごとに CORS を構成したい場合)、OPTIONS ハンドラーを追加して、フライト前の要求を処理します。 .
つまり、Gorilla Mux を使用すると、ルートは次のようになります。
accounts := router.Path("/accounts").Subrouter()
accounts.Methods("POST").Handler(AccountsCreate)
accounts.Methods("OPTIONS").Handler(AccountsCreatePreFlight)
上記の POST ハンドラに加えて、特定の OPTIONS メソッド ハンドラを定義していることに注意してください。
OPTIONS プリフライト メソッドを実際に処理するには、 AccountsCreatePreFlight を次のように定義します。
// Check the origin is valid.
origin := r.Header.Get("Origin")
validOrigin, err := validateOrigin(origin)
if err != nil {
return err
}
// If it is, allow CORS.
if validOrigin {
w.Header().Set("Access-Control-Allow-Origin", origin)
w.Header().Set("Access-Control-Allow-Methods", "POST")
w.Header().Set("Access-Control-Allow-Headers",
"Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")
}
(実際に CORS がどのように機能するかを理解することに加えて) これをすべてクリックさせたのは、プリフライト リクエストの HTTP メソッドが実際のリクエストの HTTP メソッドと異なることです。CORS を開始するために、ブラウザは HTTP Method OPTIONS を使用してプリフライト リクエストを送信します。これは、ルーターで明示的に処理する必要があります。次に、アプリケーションから適切な応答 (または「*」) を受信すると"Access-Control-Allow-Origin": origin
、実際のリクエスト。
また、標準タイプのリクエスト (つまり GET) に対してのみ "*" を実行できると思いますが、他のリクエストについては、上記のようにオリジンを明示的に設定する必要があります。