Как включить и использовать HTTP PUT и DELETE с Apache2 и PHP?

Это должно быть так просто. Я следил за каждым учебником и форумом, который мог найти, но я не могу заставить его работать. Я просто хочу создать RESTful API в PHP на Apache2.

В моей директиве VirtualHost я говорю:

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

Но каждый запрос PUT, который я делаю на сервер, я получаю 405 метод не поддерживается.

Кто-то защищал использование директивы Script, но поскольку я использую mod_php, в отличие от CGI, я не понимаю, почему это сработает.

Люди упоминают использование WebDAV, но для меня это кажется излишним. В конце концов, мне не нужна блокировка DAV, файловая система DAV и т. Д. Все, что я хочу сделать, это передать запрос на PHP-скрипт и самому справиться с этим. Я хочу включить PUT и DELETE для чистой семантики.

Вам ничего не нужно настраивать. Просто убедитесь, что запросы сопоставляются с вашим файлом PHP и используют запросы с информацией о пути. Например, если у вас в корне файл с именем handler.php с этим контентом:

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

Следующий HTTP-запрос будет работать:

 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. 

Вы можете скрыть расширение «php» с помощью MultiViews, или вы можете сделать URL полностью логичным с помощью mod_rewrite .

См. Также документацию для директивы AcceptPathInfo и этот вопрос о том, как заставить PHP не анализировать данные POST, когда enctype является multipart/form-data .

AllowOverride AuthConfig

попробуй это. Возможно, проблема с аутентификацией. Я работал с CGI-скриптом, написанным на C ++, и столкнулся с некоторыми проблемами аутентификации при передаче DELETE. Вышеупомянутое решение помогло мне. Это может помочь и в вашем случае.


Кроме того, даже если вы не получите решение проблемы PUT и DELETE, не переставайте работать, используя «CORS». Это приложение для Chrome Chrome, которое поможет вам обойти проблему, но помните, что это временное решение, так что ваша работа или эксперименты не остаются надолго. Очевидно, что вы не можете попросить своего клиента иметь «CORS» для запуска вашего решения, так как это может поставить под угрозу безопасность системы.

В linux существует /etc/apache2/mods-enabled/php5.conf dans php5.load . Если нет, включите эти модули (может потребоваться sudo apt-get install libapache2-mod-php5 ).

Вы можете просто отправить имя файла для удаления на delete.php на сервере, который может легко отменить () файл.

Технические ограничения с использованием запросов PUT и DELETE не связаны с PHP или Apache2; вместо этого на бремя браузера отправляются эти типы запросов.

Простое размещение <form action = "" method = "PUT"> не будет работать, потому что нет браузеров, поддерживающих этот метод (и они просто по умолчанию будут использовать GET, обрабатывая PUT так же, как и лечить тарабарщину, такую ​​как FDSFGS). К сожалению, эти HTTP-глаголы ограничены областью не-настольных браузеров приложений (т. Е. Потребителями веб-сервисов).