Apache mod_dav 400 Неверный запрос на несуществующий ресурс коллекции - PullRequest
1 голос
/ 23 января 2012

Похоже, что Apache отправляет обратно неверный запрос 400 для простого несуществующего ресурса коллекции.

У меня есть ресурс /test/junit/test.bin.Я хочу проверить, существует ли коллекция /test/junit/test.bin/ (то есть коллекция с тем же именем) - в соответствии с RFC 2518 коллекция (с косой чертой) и не-коллекция различаются.Когда я выдаю PROPFIND на /test/junit/test.bin/, Apache отвечает 400 Bad Request.

Теперь я понимаю, что многие люди и реализация стирают грани между коллекциями и не-коллекциями - то есть, должна ли коллекция иметь конечный слеш.Но в любом случае коллекция /test/junit/test.bin/ не существует - выдача PROPFIND для несуществующей коллекции не является "плохим запросом".Разве Apache не должен просто выпустить стандарт 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 ]

2 голосов
/ 03 июня 2016

Я получал ту же ошибку с Apache 2.4, работающим в качестве сервера Webdav в Windows 2012, и разрешил его, отключив «mod_negotiation.so»:

#LoadModule negotiation_module modules/mod_negotiation.so
0 голосов
/ 26 января 2012

Вот предположение:

Apache фактически разрешает отправлять подпуть к ресурсам.Пример с PHP:

http://example.org/index.php/foobar

Foo bar будет отправлен как PATH_INFO вместе с index.php.Я предполагаю, что это та же самая функциональность, которая теперь неправильно отправляет обратно HTTP / 1.1 400.

Соответствующим ответом действительно будет 404 Not Found, хотя, поскольку это всего лишь дополнительная косая черта, лично я, вероятно, просто сопоставлю /test.bin / to /test.bin.

Перенаправление на /test.bin также было бы неплохо.

Просто чтобы вы знали, что я не просто кто-то, я трачу 90% своего профессионального времени на HTTP и WebDAV, CalDAVи т. д.

...