Назад | Перейти на главную страницу

Как включить все методы HTTP на HTTP-сервере Apache

Как я могу включить обработку всех методов HTTP, как определено в RFC 2616, на веб-сервере Apache? Это будут:

OPTIONS
GET
HEAD
POST
PUT
DELETE
TRACE
CONNECT

Я использую HTTP-сервер Apache версии 2.2.22 (Ubuntu)
Вот мой .htaccess Файл:

<Location /output>
        Dav On
    <LimitExcept GET HEAD OPTIONS PUT>
        Allow from all
    </LimitExcept>
</Location>

Вот результат, который я получаю при запуске Telnet - метода PUT нет:

Escape character is '^]'.
OPTIONS / HTTP/1.0

HTTP/1.1 200 OK
Date: Tue, 09 Oct 2012 06:56:42 GMT
Server: Apache/2.2.22 (Ubuntu)
Allow: GET,HEAD,POST,OPTIONS
Vary: Accept-Encoding
Content-Length: 0
Connection: close
Content-Type: text/html

Connection closed by foreign host.

Есть мысли по этому поводу?

Apache реализует все соответствующие HTTP-методы для статического содержимого (фактические файлы обслуживаются непосредственно Apache). Для динамического контента (скрипты CGI, mod_phpи т. д.), Apache не заботится о том, что такое HTTP-метод (если он явно не ограничен <Limit> директива), и передает запрос соответствующему обработчику как есть. Ваш сценарий должен обрабатывать конкретный метод, как задумано, а не Apache. Даже нестандартные методы без проблем передаются динамическим обработчикам.

Протестировано с недействительным ASDFG / HTTP/1.1 запрос обрабатывается mod_php сценарий. Никаких жалоб от Apache не получено. ASDFG в $_SERVER['REQUEST_METHOD'] в скрипте обработчика.

на основе http://httpd.apache.org/docs/current/mod/core.html , эти методы можно изменить в directory и .htaccess файлы конфигурации с использованием Limit method [method] ... > ... </Limit> директива

В основном вам нужно закомментировать параметры, подобные приведенным ниже, которые используются для блокировки методов.

<Limit POST PUT DELETE>
  Require valid-user
</Limit>

Возможно, вы используете libapache2-mod-php5filter вместо libapache2-mod-php5.

Подробности: apache2 и php5: модуль или фильтр

Верный способ исправить это - узнать, почему Apache отклоняет запросы в вашем конкретном случае. Вы можете узнать это из журналов ошибок.

В моем случае, tail -f /usr/local/apache/logs/error_log дал это:

[Sun Sep 18 08:39:52.570672 2016] [:error] [pid 32076:tid 140086307448576] 
[client 93.125.93.77] ModSecurity: Access denied with code 501 (phase 2). 
Match of "rx ^((?:(?:POS|GE)T|OPTIONS|HEAD))$" against "REQUEST_METHOD" 
required. [file "/usr/local/apache/conf/modsec-imh/01_base_rules.conf"] [line 
"32"] [id "960032"] [msg "Method is not allowed by policy"] [severity 
"CRITICAL"] [tag "POLICY/METHOD_NOT_ALLOWED"] [hostname "104.244.122.237"] 
[uri "/products/order/items/45"] [unique_id "V96LGGj0eu0AAH1MR8sAAACB"]

В нем упоминается правило безопасности и файл, из которого оно взято: /usr/local/apache/conf/modsec-imh/01_base_rules.conf. Редактирование этого файла решило мою проблему.

В документе PHP есть раздел ссылок для этого http://php.net/manual/en/features.file-upload.put-method.php

Основная документация apache для этой директивы находится по адресу http://httpd.apache.org/docs/2.2/mod/mod_actions.html