最初に結論から
結論
- FastAPIはデコレーターで指定したパス通りじゃないと、
location
を返す(指定したパスがlocationに入り、ブラウザでリダイレクトが走る) - フレームワークやマネージドサービスによって仕様が違うっぽい?ので注意したい
環境
- バックエンド: FastAPI==0.74.1
- フロントエンド: JavaScript フレームワーク(axios)
事象
- axiosのBase URLをhttpsで定義しているのに、あるAPIを叩いたときにhttps環境下でhttpが混ざってるよのMixedエラーがでてきた
- なぜ?????ってずっと「axios mixedエラー」で検索してたけど、全然それっぽい記事に出会わず混乱していた
するとこんな記事に出会う
ほーん?スラッシュの有無でこんなことが起こるのか、とキーワードを変更してぐぐったら次はこれ。
なるほど???????フレームワーク次第みたいな話があったのと、リダイレクトが発生しているのか?ということでチェックしてみたところ、まじで発生してた。
ややこしいですが、バックエンドへのリクエストはプロキシ経由だったので、プロキシの入り口はhttpsなのですが、プロキシとバックエンドはhttpでした。なので、FastAPIはlocationにhttpでsetして返していたので、このような現象が発生したというわけ。
この辺で「trailing slash」という言葉を知りました。
実際FastAPIのtrailing slashが有るAPIを無しで叩いてみると、リダイレクトが発生しました。逆もしかり。
罠だな〜とか思ったので、調べてみると ?
をつけてあげるとどっちもおkになるようです。初見だとわかりづらそう(デコレーターの引数がいいんじゃなかろうか)
そもそも、なんでtrailing slashの有無で挙動が変わるのかとかリダイレクトするのかを調べにRFCとか見に行きましたがいまいちよくわからず、歴史をまとめてくれた感じの回答もありましたが、それみてなるほど〜とは思いつつ、結局リダイレクトは?ってなったので僕の中で迷宮入りになりました。
仕事があるので戻る。