Apache似乎正在为一个简单的不存在的集合资源发回400 Bad Request。
我有一个资源/test/junit/test.bin
。我想检查集合/test/junit/test.bin/
是否存在(即同名的集合)---根据RFC 2518,集合(带有斜杠)和非集合是不同的。当我在PROPFIND
上发出/test/junit/test.bin/
时,Apache会回复400 Bad Request。
现在,我知道许多人和实现已经模糊了集合和非集合之间的界限 - 也就是说集合是否必须有一个结束斜杠。但无论如何,集合/test/junit/test.bin/
都不存在 - 在不存在的集合上发出PROPFIND
不是“坏请求”。不应该只发布标准的404 Not Found或410 Gone吗?我的请求有什么“不好”?
PROPFIND /test/junit/test.bin/ HTTP/1.1
depth: 1
content-length: 102
authorization: BASIC XXXXX
host: example.com
<?xml version="1.0" encoding="UTF-8"?>
<D:propfind xmlns:D="DAV:">
<D:allprop />
</D:propfind>
HTTP/1.1 400 Bad Request
Date: Mon, 23 Jan 2012 15:30:37 GMT
Server: Apache/2.2.11 (Unix) mod_ssl/2.2.11 OpenSSL/0.9.8k DAV/2 SVN/1.7.2 mod_jk/1.2.28
Content-Length: 226
Connection: close
Content-Type: text/html; charset=iso-8859-1
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
</body></html>
以下是Apache在日志中添加的内容:
[Mon Jan 23 14:31:09 2012] [error] [client XX.XXX.XX.XXX] Could not fetch resource information. [400, #0]
[Mon Jan 23 14:31:09 2012] [error] [client XX.XXX.XX.XXX] (20)Not a directory: The URL contains extraneous path components. The resource could not be identified. [400, #0]
是的,我知道存在同名资源,我要求提供集合的属性。所以我们可以说“这就是Apache这样做的原因”。但这并没有解释任何事情 - 它只是对Apache将要做的事情的预测。我想知道为什么Apache认为发回400而不是404更合适?
答案 0 :(得分:2)
我在Windows 2012上作为Webdav服务器运行时遇到了同样的错误,并解决了它禁用&#34; mod_negotiation.so&#34;:
#LoadModule negotiation_module modules/mod_negotiation.so
答案 1 :(得分:0)
这是猜测:
Apache实际上允许将子路径发送到资源。 PHP的一个例子:
http://example.org/index.php/foobar
Foo bar将作为PATH_INFO发送到index.php。我的猜测是它的功能与现在错误地发回HTTP / 1.1 400相同。
一个恰当的响应确实是404 Not Found,虽然因为它只是一个额外的斜杠,我个人可能只是将/test.bin/映射到/test.bin。
重定向到/test.bin也很好。
您知道我不仅仅是任何人,我将90%的专业时间花在HTTP和WebDAV,CalDAV等上。