Apache mod_dav 400错误请求不存在的收集资源

时间:2012-01-23 18:01:24

标签: apache http webdav

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更合适?

2 个答案:

答案 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等上。