Подтвердить что ты не робот

Как включить и использовать 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 Script и обрабатывать все сам. Я хочу только включить PUT и DELETE для чистой семантики.

4b9b3361

Ответ 1

Вам ничего не нужно настраивать. Просто убедитесь, что запросы сопоставляются с вашим файлом 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.

Ответ 2

  AllowOverride AuthConfig

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


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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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