it-swarm.com.de

Wie kann man HTTP PUT und DELETE mit Apache2 und PHP aktivieren und verwenden?

Es sollte so einfach sein. Ich habe jedes Tutorial und Forum verfolgt, das ich finden konnte, aber ich kann es nicht zum Laufen bringen. Ich möchte einfach eine RESTful-API in PHP auf Apache2 erstellen.

In meiner VirtualHost-Direktive sage ich:

<Directory />
    AllowOverride All
    <Limit GET HEAD POST PUT DELETE OPTIONS>
        Order Allow,Deny
        Allow from all
    </Limit>
</Directory>

Jede PUT-Anfrage, die ich an den Server stelle, bekomme ich jedoch nicht.

Jemand hat die Verwendung der Script-Direktive befürwortet, aber da ich im Gegensatz zu CGI mod_php verwende, kann ich nicht verstehen, warum das funktionieren würde.

Die Leute erwähnen die Verwendung von WebDAV, aber das scheint mir übertrieben zu sein. Schließlich brauche ich kein DAV-Locking, kein DAV-Dateisystem usw. Alles, was ich tun möchte, ist, die Anforderung an ein PHP -Skript weiterzuleiten und alles selbst zu handhaben. Ich möchte nur PUT und DELETE für die saubere Semantik aktivieren.

30
Andreas Jansson

Sie müssen nichts konfigurieren. Stellen Sie einfach sicher, dass die Anforderungen Ihrer PHP Datei entsprechen, und verwenden Sie Anforderungen mit Pfadinformationen. Wenn Sie zum Beispiel eine Datei namens handler.php mit folgendem Inhalt im Stammverzeichnis haben:

<?php

var_dump($_SERVER['REQUEST_METHOD']);
var_dump($_SERVER['REQUEST_URI']);
var_dump($_SERVER['PATH_INFO']);

if (($stream = fopen('php://input', "r")) !== FALSE)
    var_dump(stream_get_contents($stream));

Die folgende HTTP-Anfrage würde funktionieren:

Established connection with 127.0.0.1 on port 81
PUT /handler.php/bla/foo HTTP/1.1
Host: localhost:81
Content-length: 5
 
boo
HTTP/1.1 200 OK
Date: Sat, 29 May 2010 16:00:20 GMT
Server: Apache/2.2.13 (Win32) PHP/5.3.0
X-Powered-By: PHP/5.3.0
Content-Length: 89
Content-Type: text/html
 
string(3) "PUT"
string(20) "/handler.php/bla/foo"
string(8) "/bla/foo"
string(5) "boo
"
Connection closed remotely.

Sie können die Erweiterung "php" mit MultiViews ausblenden oder URLs mit mod_rewrite vollständig logisch machen.

Lesen Sie auch die Dokumentation zur AcceptPathInfo - Direktive und diese Frage, wie Sie make PHP und nicht die Pars POST Daten analysieren, wenn der Enctype multipart/form-data ist.

16
Artefacto

IIRC Der Zweck des Formularmethodenattributs war die Definition verschiedener Transportmethoden. Daher definiert HTML 5.2 nur GET-, POST- und DIALOG-Methoden für Transport- und Dialogaktionen, nicht wie der Server die Daten verarbeiten soll.

Ruby-on-Rails löst dieses Problem, indem Sie POST/GET für alles verwenden und eine verborgene Formularvariable hinzufügen, die die eigentliche ReST-Methode definiert. Dieser Ansatz ist ungeschickter und fehleranfälliger, entlastet jedoch sowohl den HTML-Standard als auch die Browserentwickler.

Die Formularmethode wurde vor ReST definiert. Daher können Sie ReST in HTML nicht definieren, auch nachdem Sie Apache und PHP aktiviert haben, da die Browser HTML-konform sind und für alle nicht in HTML definierten Werte standardmäßig GET/POST verwenden. Das heißt, wenn Sie ein Formular mit einer PUT-Methode an den Browser senden, ändert der Browser dieses in GET und verwendet dieses stattdessen. Die verborgene Variable durchläuft jedoch alles unverändert, sodass Sie den Formularverarbeitungsprozess anpassen können.

Hoffentlich hilft das

0
Peter Gostelow

AllowOverride AuthConfig

versuche dies. Authentifizierung kann das Problem sein. Ich arbeitete mit einem in C++ geschriebenen CGI-Skript und hatte beim Bestehen von DELETE einige Authentifizierungsprobleme. Die obige Lösung hat mir geholfen. Es kann auch in Ihrem Fall helfen.


Auch wenn Sie keine Lösung für Ihr Problem von PUT und DELETE erhalten, hören Sie nicht auf zu arbeiten, sondern verwenden Sie "CORS". Es ist eine Google Chrome-App, mit der Sie das Problem umgehen können. Denken Sie jedoch daran, dass dies eine vorübergehende Lösung ist, sodass Ihre Arbeit oder Ihre Experimente nicht lange eingefroren werden. Natürlich können Sie Ihren Client nicht auffordern, "CORS" zur Ausführung Ihrer Lösung zu aktivieren, da dies die Systemsicherheit beeinträchtigen kann.

0
MSharq