0

我正在使用的 WebDAV 库正在发出此请求

MKCOL /集合 HTTP/1.1

由于 /collection 存在,Apache 向哪个 Apache 发出 301

HTTP/1.1 301
地点:/收藏/

而不是一个

HTTP/1.1 405 方法不允许

规范对此有点含糊(或者可能是我对它的阅读),但是在发布 MKCOL 时,您的集合名称是否应该始终以斜杠结尾(因为它是一个集合)?

4

1 回答 1

3

如您所知,HTTP 代码 301 表示“永久移动”。

Apache 正在优雅地将您重定向到正确的 URL。它无法为您提供 405,因为您提供的 URL 不存在资源。但它也无法创建具有该确切 URL 的资源。它可以做的是使用正确的 URL 创建资源,然后重定向您。

但是要回答您的问题,您应该以“/”结束集合以消除歧义,否则产生的 URI 规范化行为取决于我相信的服务器。我不相信任何 RFC 都强制添加尾部斜杠。

编辑:

MKCOL 可能会在没有尾部斜杠的情况下成功,但请注意报告创建的资源有一个尾部斜杠。

根据 RFC,服务器有一个选项。因为它决定了 URL 规范化过程,只要它不违反规范。

然后,服务器可以尝试规范化您在每次操作中发送的任何 URL,返回大量 3xx 代码。这变得昂贵。或者它可以在开始时纠正您(POST、MKCOL 等),然后失败或重定向。

但关键是它总是会让你知道它喜欢的 URL。

RFC 2616中有关 HTTP URL 方案的内容

3.2.3 URI比较

在比较两个 URI 以确定它们是否匹配时,客户端
应该使用区分大小写的字节对整个 URI 进行逐个字节的比较,但以下情况除外:

  - A port that is empty or not given is equivalent to the default
    port for that URI-reference;

    - Comparisons of host names MUST be case-insensitive;

    - Comparisons of scheme names MUST be case-insensitive;

    - An empty abs_path is equivalent to an abs_path of "/".

“保留”和“不安全”集合(参见 RFC 2396 [42])中的字符以外的字符
等同于它们的“%”十六进制十六进制编码。

例如,以下三个 URI 是等价的:

  http://abc.com:80/~smith/home.html
  http://ABC.com/%7Esmith/home.html
  http://ABC.com:/%7esmith/home.html

请注意没有提及 abs_path 是如何定义的。根据规范,服务器也不能严格地说忽略你的斜线。因此,发出“MKCOL /collection”并在没有新的“/collection/” URL 的情况下创建常规 2xx 是不正确的。

AFAIK,定义 abs_path 的相关 RFC 未指定尾部斜杠。因此,取决于服务器如何比较和规范这些内容。

于 2008-09-25T07:18:38.913 回答