Как включить и использовать HTTP PUT и DELETE с Apache2 и PHP? - PullRequest
30 голосов
/ 29 мая 2010

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

Ответы [ 6 ]

15 голосов
/ 29 мая 2010

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

0 голосов
/ 18 октября 2018

IIRC целью атрибута метода формы было определить различные методы транспорта. Следовательно, HTML 5.2 определяет только методы GET, POST и DIALOG для транспорта и действий диалога, а не то, как сервер должен обрабатывать данные.

Ruby-on-rails решает эту проблему, используя POST / GET для всего и добавляя скрытую переменную формы, которая определяет фактический метод ReST. Этот подход более неуклюжий и подвержен ошибкам, но снимает бремя как со стороны стандарта HTML, так и разработчиков браузеров.

Метод формы был определен до ReST, поэтому вы не можете определить ReST в HTML, даже после включения Apache и PHP, поскольку браузеры соответствуют HTML и, следовательно, по умолчанию используют GET / POST для всех значений, не определенных HTML. Это означает, что когда вы отправляете форму в браузер методом PUT, браузер меняет его на GET и использует его вместо этого. Однако скрытая переменная проходит через все без изменений, поэтому вы можете использовать ее для настройки процесса обработки формы.

Надеюсь, что поможет

0 голосов
/ 15 октября 2015

AllowOverride AuthConfig

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


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

0 голосов
/ 09 января 2015

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

0 голосов
/ 08 декабря 2011

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

0 голосов
/ 30 мая 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...