2012-01-23 6 views
1

Apacheは単純な存在しないコレクションリソースに対して400 Bad Requestを返信しているようです。Apache mod_dav 400存在しないコレクションリソースの要求がありません

私はリソース/test/junit/test.binを持っています。コレクション/test/junit/test.bin/(つまり同じ名前のコレクション)が存在するかどうかをチェックします。RFC 2518に従って、コレクション(スラッシュ付き)と非コレクションは区別されます。 /test/junit/test.bin/PROPFINDを発行すると、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が404ではなく400を返す方が適切だと考えている理由を知りたいのですが?

+0

apacheのエラーログで詳細を示した場合、私は個人的に疑問に思うだろう。エラーログレベルをかなり高く設定することができます。 – Evert

+0

良いアイデア---ログから関連するエントリを追加しました。それはあなたが推測するものです。私はここでApacheのアプローチに同意します---他の誰かが同意しますか? –

+0

私はApacheにバグを提出しました:https://issues.apache.org/bugzilla/show_bug.cgi?id=52539 –

答えて

0

ここに推測しておきます:

Apacheは、実際にはサブパスをリソースに送ることができます。 PHPを使用した例:

Fooバーは、index.phpに沿ってPATH_INFOとして送信されます。私の推測は、HTTP/1.1 400を間違って返信するのと同じ機能だということです。

適切な応答は確かに404が見つかりませんでしたが、追加されたスラッシュだけなので、個人的にはおそらくマップ/テストです。 bin/to/test.binにコピーします。

/test.binにリダイレクトすると、大丈夫です。

あなたは、私は誰もいないよ知っているだけので、私はなど、HTTPおよびWebDAV、CalDAVの上で私の専門の時間の90%を費やし

+0

応答に感謝します。 「Apacheは実際には、Apacheが実際にはサブパスをリソースに送ることができる」と言ったとき、そして「Foo barはPATH_INFOとしてindex.phpに送信されます」と言うときには、特にPROPFINDメソッドを参照すると、RFC 2518では返される子リソースを指定するための "Depth"ヘッダーがあり、どのように解釈するべきかについては非常に具体的です。私はRFC 2518でPATH_INFOについて語る言語を見つけることができません。また、コレクション以外のリソースにも同様の名前が付いていれば、コレクションを別の方法で扱うべきです。 –

+0

提案したように '/ test.bin /'を '/ test.bin'にマッピングすると、RFC 2518と完全に違うようです。そのRFCは" ...リソースは、この場合、レスポンスには、 '/'で終わるURIを指すコンテンツの場所のヘッダーを返さなければならない(SHOULD)が、反対のマッピング(例えば、_removing_は後続のスラッシュ)の規定がない。ここで議論されている。 –

+0

はい、標準については何も言いません。これは間違ってapacheによって間違って実装されています。あなたは理由が*間違って実装されるかもしれないという根拠を求めていたので、私はあなたに最高の賭けをしています。あなたはこれから何を達成したいですか? – Evert

2

私は、Apache 2.4は、上のWebDAVサーバーとして動作していると同じエラーを得ていましたWindowsの2012年「mod_negotiation.so」無効それを解決:

#LoadModule negotiation_module modules/mod_negotiation.so 
関連する問題