Jak włączyć wszystkie metody HTTP na serwerze HTTP Apache

16

Jak mogę włączyć obsługę wszystkich metod HTTP zdefiniowanych w RFC 2616 na serwerze WWW Apache? Byłyby to:

OPTIONS
GET
HEAD
POST
PUT
DELETE
TRACE
CONNECT

Korzystam z serwera Apache HTTP Server, wersja 2.2.22 (Ubuntu)
Oto mój .htaccessplik:

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

Oto wynik, który otrzymuję po uruchomieniu Telnet - nie ma metody 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.

Masz jakieś przemyślenia na ten temat?


źródło
jakiej wersji apache używasz?
Wersja serwera: Apache / 2.2.22 (Ubuntu)
1
Jesteś ograniczenia metody na /outputmiejscu, ale prosisz OPTIONSna /miejscu. Limity metod nie dotyczą lokalizacji nadrzędnych, a tylko głębszych.
lanzz

Odpowiedzi:

7

Apache implementuje wszystkie odpowiednie metody HTTP dla zawartości statycznej (rzeczywiste pliki obsługiwane bezpośrednio przez Apache). W przypadku zawartości dynamicznej (skrypty CGI mod_phpitp.) Apache nie dba o to, czym jest metoda HTTP (chyba że jest to wyraźnie ograniczone przez <Limit>dyrektywę ) i przekazuje żądanie do odpowiedniego modułu obsługi w takiej postaci, w jakiej jest. Twój skrypt musi obsługiwać określoną metodę zgodnie z przeznaczeniem, a nie Apache. Nawet niestandardowe metody są bez problemu przekazywane do dynamicznych programów obsługi.

Przetestowano z niepoprawnym ASDFG / HTTP/1.1żądaniem obsługiwanym przez mod_phpskrypt. Brak skargi od Apache, otrzymanej ASDFGw $_SERVER['REQUEST_METHOD']skrypcie obsługi.

Lanzz
źródło
Dziękuję za odpowiedź. Zedytowałem plik .htaccess, aby zezwolić na niektóre metody http. Sprawdziłem za pomocą OPTIONS / HTTP / 1.0 przez telnet. Dozwolone metody HTTP nigdy się nie zmieniają. Ten problem może nie dotyczy apache, ale nadal mam problem z włączeniem wszystkich metod http.
Prawdopodobnie powinieneś opublikować dokładnie to, czego próbujesz, jaką odpowiedź spodziewasz się zobaczyć, co widzisz, a także sposób obsługi tych żądań po stronie serwera. Nic nie powinno powstrzymywać OPTIONSżądania, chyba że wyraźnie zabraniasz go <Limit OPTIONS> deny from all </Limit>lub podobnej kontroli dostępu.
lanzz
2

w oparciu o http://httpd.apache.org/docs/current/mod/core.html metody te można modyfikować w plikach konfiguracyjnych directoryi .htaccessprzy użyciu Limit method [method] ... > ... </Limit>dyrektywy

Zasadniczo musisz skomentować opcje takie jak te poniżej, które służą do blokowania metod.

<Limit POST PUT DELETE>
  Require valid-user
</Limit>
MaVRoSCy
źródło
1

Pewnym sposobem na rozwiązanie tego jest ustalenie, dlaczego Apache odrzuca żądania w konkretnym przypadku . Możesz się tego nauczyć z dzienników błędów.

W moim przypadku tail -f /usr/local/apache/logs/error_logdał to:

[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"]

Wymienia reguły zabezpieczeń, a plik to przychodzi z: /usr/local/apache/conf/modsec-imh/01_base_rules.conf. Edycja tego pliku rozwiązała mój problem.

Anton Khamets
źródło