Por que o Apache retorna um código de erro 405 em uma solicitação PUT para um arquivo ou diretório que não existe?

3

Descobri recentemente que, quando faço uma solicitação PUT para o Apache em um arquivo ou diretório que não existe, recebo um erro 405 Method Not Allowed, em vez de um erro 404 Not Found. Estou curioso para saber por quê?

PUT request from curl:

curl -i -X PUT -d '{"var":"val"}' "http://server/doesNotExist.htm"

Resposta do servidor:

HTTP/1.1 405 Method Not Allowed
Date: Sat, 16 Dec 2017 03:31:18 GMT
Server: Apache/2.2.15 (CentOS)
Allow: GET,HEAD,POST,OPTIONS,TRACE
Content-Length: 316
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>405 Method Not Allowed</title>
</head><body>
<h1>Method Not Allowed</h1>
<p>The requested method PUT is not allowed for the URL /doesNotExist.htm.</p>
<hr>
<address>Apache/2.2.15 (CentOS) Server at xxx.xxx.xxx.xxx Port 80</address>
</body></html>

Ao fazer uma chamada para um diretório que não existe, recebo o mesmo erro 405 em vez do 404 esperado. Estou executando o Apache 2.2.15 no CentOS 6.9 com o PHP 5.6.31. O arquivo httpd.conf não foi modificado.

O que o Apache está fazendo? Existe alguma maneira de fazê-lo retornar um 404 em vez do 405 se um arquivo não existe?

ATUALIZAÇÃO:

Ao fazer uma solicitação PUT para um arquivo que existe, recebo 200 OK.

HTTP/1.1 200 OK
Date: Sat, 16 Dec 2017 04:38:21 GMT
Server: Apache/2.2.15 (CentOS)
X-Powered-By: PHP/5.6.31
Content-Length: 2742
Connection: close
Content-Type: text/html; charset=UTF-8

<content of file here>

UPDATE 2:

Eu notei que se eu fizer um pedido PUT para um arquivo .php que não existe, por exemplo, "doesnotexist.php" eu recebo um 404. Se eu fizer um pedido PUT para um arquivo .htm, por exemplo, "doesnotexist.htm" ou para um diretório ou seja, " link " Eu recebo um 405.

    
por user2395126 16.12.2017 / 05:04

1 resposta

3

As evidências fornecidas por você sugerem que os 405s ocorrem quando uma solicitação PUT é direcionada ao manipulador de solicitações padrão. (O comportamento PUT é diferente para o manipulador PHP.)

O manipulador padrão está verificando o método de solicitação antes para verificar se o recurso existe e possui as permissões corretas. Como o manipulador padrão não suporta PUT, a menos que isso esteja ativado, você está vendo 405s em vez de 404s.

O método PUT é normalmente ativado listando-o no <limit> config.

    
por 16.12.2017 / 06:11

Tags