2012-01-23 18 views
1

Apache似乎在爲簡單的不存在的收集資源發送400錯誤請求。Apache mod_dav 400對不存在的收集資源的錯誤請求

我有一個資源/test/junit/test.bin。我想檢查集合/test/junit/test.bin/是否存在(即相同名稱的集合)---根據RFC 2518,集合(帶有斜槓)和非集合是不同的。當我在/test/junit/test.bin/上發出PROPFIND時,Apache響應400錯誤請求。

現在,我明白很多人和實現已經模糊了集合和非集合之間的界限 - 也就是說集合是否必須有結尾斜槓。但無論如何,集合/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> 

這裏就是阿帕奇放入日誌:

[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

我個人懷疑apache是​​否在錯誤日誌中顯示更多細節。您可以將錯誤日誌級別設置得相當高。 – Evert

+0

好主意---我從日誌中添加了相關條目。這是關於你會猜到的。我不同意Apache的方法---其他人同意? –

+0

我已經提交了一個Apache的錯誤:https://issues.apache.org/bugzilla/show_bug.cgi?id=52539 –

回答

0

這裏猜測:

Apache實際上允許子路徑被髮送到資源。以PHP爲例:

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

Foo bar將作爲PATH_INFO發送到index.php。我的猜測是現在錯誤地發回HTTP/1.1 400的功能是相同的。

一個合適的響應確實是404 Not Found,儘管因爲它只是一個附加的斜槓,我個人可能只是映射/測試。 bin/to /test.bin。

重定向到/test.bin恕我也沒事。

只要你知道我不是隨便什麼人,我花了90%的我的職業時間對HTTP和WebDAV,的CalDAV等

+0

感謝您的迴應。當你說「Apache實際上允許將子路徑發送到資源」時,我並不完全理解你的意思,並且當你說「Foo bar將作爲PATH_INFO發送到index.php」時。具體參考PROPFIND方法,RFC 2518允許「深度」頭部指定應該返回哪些子資源,並且關於應該如何解釋它非常具體。我無法在RFC 2518中找到有關PATH_INFO的任何語言,或者如果非集合資源具有類似的名稱,則應該以不同的方式對待集合。 –

+0

就像你建議的那樣,將'/ test.bin /'映射到'/ test.bin',這看起來完全違背了RFC 2518.RFC認爲「......一個資源可能接受一個沒有尾隨'/'的URI來指向到一個集合,在這種情況下,它應該返回一個指向以'/'結尾的URI的響應中的內容位置標題,但是它沒有提供相反的映射(例如_removing_一個尾部的斜線),這就是正在這裏討論。 –

+0

是的,我不是在談標準。這絕對是由apache不正確實施的。你要求的理由是爲什麼*它可能被錯誤地實施,所以我給你我最好的選擇。你希望從中獲得什麼? – Evert

2

我得到同樣的錯誤與Apache 2.4運行作爲WebDAV服務器Windows 2012並解決它禁用「mod_negotiation.so」:

#LoadModule negotiation_module modules/mod_negotiation.so