POST のレスポンスとして PDF を返す機能が、特定の端末でのみ 405 Method Not Allowed になりました。原因は Adobe Acrobat の Chrome 拡張機能で、アプリケーション側の問題ではありませんでした。
新規タブに 405 が出る
- PDF を表示する操作で、新規タブに
405 Method Not Allowedが出る - 同じアカウント・同じ URL でも、端末によって再現する / しないが分かれる
- サーバーは無変更。リリースのタイミングとも一致しない
再現する端末には拡張機能が入っていた
再現する端末に共通していたのは、Adobe Acrobat の Chrome 拡張機能が有効になっていることでした。無効にすると解消し、有効に戻すと再現します。
拡張機能が同じ URL を GET で取り直す
この拡張機能は内蔵 PDF ビューアを自前のビューアに置き換えます。その際、受信済みのレスポンスボディを再利用せず、タブの URL を GET で取り直します。
[意図した動作]
ブラウザ ──POST──► サーバー ──200 application/pdf──► 内蔵ビューアで表示
[拡張機能が有効な場合]
ブラウザ ──POST──► サーバー ──200 application/pdf──► 拡張機能が横取り
│
サーバー ◄──GET(同じ URL)───────┘ ← メソッドが変わる
│
└──405 Method Not Allowed──► タブに表示される
POST しか受け付けない URL に GET が飛ぶため 405 になります。PDF の取得自体は成功しているものの、拡張機能がその結果を使わずに取り直しています。
次の 4 つが重なったときに起きる
- PDF を POST のレスポンスとして返している
Content-Disposition: inline(attachmentならビューアを経由しないため発生しない)- その URL に GET のハンドラがない
- 端末で該当の拡張機能が有効
GET で取得している PDF では問題になりません。取り直しても同じレスポンスが返ります。
アプリが発行していない GET を見つける
- 端末で挙動が分かれるなら、原因はアプリの外にある可能性が高い。拡張機能・セキュリティソフト・プロキシが候補
- 手がかりはアクセスログに残る。アプリが送るはずのない GET が、POST の直後に同じ URL へ記録されている
- 405 は URL 自体が一致していることを示す。ルーティングは通ったうえでメソッドだけが弾かれている。単一メソッドしか使わない URL でこれが出た場合、アプリ以外が発行していると考えられる