
私はカスタム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ただし、他のすべての機能は動作します。「通常の」ポートに切り替えてみましたが、結果は同じでした。