
Ich arbeite an einer Webanwendung, die mit einer benutzerdefinierten REST-API interagiert. Es handelt sich im Grunde genommen um eine Datentabelle, die über die Anwendung aktualisiert wird. Ich versuche, diePATCHMethode für die Updates, aber Apache gibt einen 404-Fehler zurück, wenn ich die Anfrage sende.
Das Seltsame ist, dass GET- und POST-Anfragen an dieselbe URL einwandfrei funktionieren. Ich kann den Code für die REST-API als Workaround ändern, aber meines Wissens ist PATCH mehr "richtig", wie wir die Anfrage in der API verwenden.
Ein paar Details:
Es scheint, dass Apache die Anfrage blockiert, bevor sie die benutzerdefinierte REST-API erreicht. Ich kann sowohl PATCH- als auch GET-Anfragen in den Apache-Zugriffsprotokollen sehen, aber nur die GET-Anfrage erscheint im benutzerdefinierten REST-API-Protokoll (FWIW, die benutzerdefinierte REST-API ist implementiert inFlasche) mitWaffenhornals Hosting-Server.
Beispiele für Apache-Zugriffsprotokolldatensätze:
192.168.0.1 – unbekannt [27.08.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 - Admin-Benutzer [27.08.2021:18:23:43 +0000] "GET /admin-api/services/12872 HTTP/1.1" 200 988 "-" ...
Mir ist aufgefallen, dass die PATCH-Anfrage den Benutzernamen durch „unbekannt“ ersetzt. Das ließ mich glauben, dass etwas mit CORS nicht stimmte. Ich fand ein „Header"-Konfiguration, in der OPTIONS und PATCH fehlten, also habe ich sie hinzugefügt. Das Problem besteht immer noch. Unten sehen Sie die aktuelle Konfiguration der Option:
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, PATCH"
Ich sehe keine Pre-Flight OPTIONS-Anfragen in den Apache-Protokollen oder im Browser-Konsolenfenster. Ich habe es mit Google Chrome (92.0) und Firefox (91.0) versucht.
Die PATCH-Anfragen haben den Header „access-control-allow-origin“ auf „POST, GET, OPTIONS, PATCH“ gesetzt.
Die Apache-Proxy-Konfiguration verwendet einen Unix-Socket als Proxy für Gunicorn:
<Location /admin-api> ProxyPass unix:/run/admin-api.sock|http://127.0.0.1 </Location>
JavaScript-Abrufanforderung: (
apiUrl
undid
sind Variablen, die zuvor in der Funktion festgelegt wurden):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 Version 2.4.6. Ich weiß, dasstechnischUnix-Sockets wurden implementiert in2.4.7, aber alle anderen Funktionen funktionieren. Ich habe auch versucht, auf „normale“ Ports umzuschalten, aber ich erhalte das gleiche Ergebnis.