web-dev-qa-db-fra.com

Comment activer et utiliser HTTP PUT et DELETE avec Apache2 et PHP?

Ça devrait être si simple. J'ai suivi tous les tutoriels et forums que j'ai pu trouver, mais je ne parviens pas à le faire fonctionner. Je veux simplement construire une API RESTful dans PHP sur Apache2.

Dans ma directive VirtualHost, je dis:

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

Pourtant, chaque requête PUT que je fais au serveur, je reçois la méthode 405 non supportée.

Quelqu'un a préconisé l’utilisation de la directive Script, mais comme j’utilise mod_php, contrairement à CGI, je ne vois pas pourquoi cela fonctionnerait.

Les gens mentionnent l’utilisation de WebDAV, mais pour moi, cela semble exagéré. Après tout, je n'ai pas besoin du verrouillage DAV, d'un système de fichiers DAV, etc. Tout ce que je veux faire, c'est transmettre la demande à un script PHP et tout gérer moi-même. Je veux seulement activer PUT et DELETE pour la sémantique propre.

30
Andreas Jansson

Vous n'avez besoin de rien configurer. Assurez-vous simplement que les demandes correspondent à votre fichier PHP et utilisez les demandes avec les informations de chemin. Par exemple, si vous avez à la racine un fichier nommé handler.php avec ce contenu:

<?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));

La requête HTTP suivante fonctionnerait:

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.

Vous pouvez masquer l'extension "php" avec MultiViews ou vous pouvez rendre des URL complètement logiques avec mod_rewrite .

Reportez-vous également à la documentation de la directive AcceptPathInfo et à la question de savoir comment rendre PHP pas analyser les données POST lorsque enctype est multipart/form-data .

16
Artefacto

IIRC L'objectif de l'attribut de méthode de formulaire était de définir différentes méthodes de transport. Par conséquent, HTML 5.2 définit uniquement les méthodes GET, POST et DIALOG pour le transport et les actions de dialogue, et non la manière dont le serveur doit traiter les données.

Ruby-on-Rails résout ce problème en utilisant POST/GET pour tout et en ajoutant une variable de formulaire masquée qui définit la méthode ReST réelle. Cette approche est plus lourde et sujette aux erreurs, mais elle supprime le fardeau tant de la norme HTML que des développeurs de navigateurs.

La méthode de formulaire ayant été définie avant ReST, vous ne pouvez pas définir ReST en HTML, même après avoir activé Apache et PHP, car les navigateurs sont conformes à HTML et donc, par défaut, à GET/POST pour toutes les valeurs définies non HTML. Cela signifie que lorsque vous envoyez un formulaire au navigateur avec une méthode PUT, le navigateur le modifie en GET et l’utilise à la place. La variable masquée, cependant, passe par tout inchangé, vous pouvez donc l'utiliser pour personnaliser votre processus de traitement de formulaire.

J'espère que cela pourra aider

0
Peter Gostelow

AllowOverride AuthConfig

essaye ça. L'authentification peut être le problème. Je travaillais avec un script CGI écrit en C++ et j'ai dû faire face à des problèmes d'authentification lorsque nous avons passé DELETE. La solution ci-dessus m'a aidé. Cela peut aussi vous aider.


De plus, même si vous ne trouvez pas la solution à votre problème de PUT et DELETE, n’arrêtez pas de travailler, utilisez plutôt "CORS". Il s'agit d'une application Google Chrome, qui vous aidera à contourner le problème, mais rappelez-vous qu'il s'agit d'une solution temporaire, afin que votre travail ou vos expériences ne restent pas figés. De toute évidence, vous ne pouvez pas demander à votre client d'activer "CORS" pour exécuter votre solution, car cela pourrait compromettre la sécurité des systèmes.

0
MSharq