为什么 Apache 在对不存在的文件或目录发出 PUT 请求时返回 405 错误代码?

为什么 Apache 在对不存在的文件或目录发出 PUT 请求时返回 405 错误代码?

我最近发现,当我向 Apache 发出不存在的文件或目录的 PUT 请求时,我收到 405 方法不允许错误,而不是 404 未找到错误。我很好奇为什么?

来自 curl 的 PUT 请求:

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

服务器响应:

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>

当调用不存在的目录时,我收到相同的 405 错误,而不是预期的 404。我在 CentOS 6.9 上运行 Apache 2.2.15,使用 PHP 5.6.31。httpd.conf 文件尚未修改。

Apache 在做什么?如果文件不存在,有什么方法可以让它返回 404 而不是 405?

更新:

当对确实存在的文件发出 PUT 请求时,我收到 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>

更新2:

我注意到,如果我向不存在的 .php 文件(即“doesnotexist.php”)发出 PUT 请求,则会得到 404。如果我向 .htm 文件(即“doesnotexist.htm”)或目录(即“http://服务器/doesnotexist“我得到了 405。

答案1

您提供的证据表明,当 PUT 请求定向到默认请求处理程序时,会发生 405 错误。(PHP 处理程序的 PUT 行为有所不同。)

默认处理程序正在检查请求方法它检查资源是否存在并且是否具有正确的权限。由于默认处理程序不支持 PUT(除非启用此功能),因此您看到的是 405 而不是 404。

PUT 方法是通常通过在配置中列出它来启用它<limit>

相关内容