PATCHリクエストは404を返し、POSTとGETは動作する

PATCHリクエストは404を返し、POSTとGETは動作する

私はカスタムREST APIとやりとりするウェブアプリケーションに取り組んでいます。基本的にはアプリケーションを通じて更新されるデータのテーブルです。パッチ更新のためのメソッドを実行しましたが、リクエストを送信すると Apache から 404 エラーが返されます。

奇妙なのは、同じURLへのGETリクエストとPOSTリクエストは問題なく機能することです。回避策としてREST APIのコードを変更することはできますが、私の理解ではPATCHの方が「正しいAPI でリクエストをどのように使用しているかについて説明します。

詳細:

  • Apacheは、カスタムREST APIに到達する前にリクエストをブロックしているようです。ApacheのアクセスログにはPATCHリクエストとGETリクエストの両方が表示されていますが、カスタムREST APIログにはGETリクエストのみが表示されます(ちなみに、カスタムREST APIはフラスコ)を使用してガンイコーンホスティングサーバーとして。

    Apache アクセス ログ レコードの例:

    192.168.0.1 - 不明 [27/Aug/2021:18:23:27 +0000] "PATCH /admin-api/services/12872 HTTP/1.1" 404 14 "https://www.example.com/admin-dashboard/" ...

    192.168.0.1 - adminuser [27/Aug/2021:18:23:43 +0000] "GET /admin-api/services/12872 HTTP/1.1" 200 988 "-" ...

  • 私が気づいたことの 1 つは、PATCH リクエストがユーザー名を「不明」に置き換えていることです。これにより、CORS に何か問題があると確信しました。「ヘッダ「」構成に OPTIONS と PATCH が欠落していたため、追加しました。それでも同じ問題が発生します。以下はオプションの現在の構成です。

    Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, PATCH"
    
  • Apache ログまたはブラウザ コンソール ウィンドウにプリフライト OPTIONS リクエストが表示されません。Google Chrome (92.0) と Firefox (91.0) で試しました。

  • PATCHリクエストには「access-control-allow-origin」ヘッダーが「POST、GET、OPTIONS、PATCH」に設定されています。

  • Apache プロキシ構成では、Unix ソケットを使用して Gunicorn にプロキシします。

    <Location /admin-api>
      ProxyPass unix:/run/admin-api.sock|http://127.0.0.1
    </Location>
    
  • JavaScript フェッチ リクエスト: (apiUrlおよび はid関数内で先に設定された変数):

    let resp = await fetch(`${apiUrl}/services/${id}`, {
       credentials: "include",
       method: "PATCH",
       headers: {
         "Content-Type": "application/json",
         Accept: "application/json",
       },
       body: JSON.stringify({
         data: { min: 1, max: 3 },
       }),
     });
    
  • Apacheバージョン2.4.6。技術的にUnixソケットは2.4.7ただし、他のすべての機能は動作します。「通常の」ポートに切り替えてみましたが、結果は同じでした。

関連情報