2012-01-23 6 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을 발행하는 것은 "잘못된 요청"이 아닙니다. 아파치가 단순히 표준 404를 찾지 못했는지 아니면 410을 찾지 않았는가? 내 요청에 대해 "나쁜"것은 무엇입니까?

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] 

예, 저도 같은 이름의 자원이 존재하고 내가 컬렉션의 속성에 대한 부탁 해요 이해합니다. 그래서 우리는 "이것이 아파치가 이것을하는 이유입니다"라고 말할 수 있습니다. 그러나 이것은 아무 것도 설명하지 않습니다. 이것은 단순히 아파치가 할 일에 대한 예측 일뿐입니다. 아파치가 404가 아닌 400을 돌려주는 것이 더 적절하다고 생각하는 이유를 알고 싶습니다.

+0

아파치가 오류 로그에 세부 정보를 표시하는지 궁금합니다. 오류 로그 레벨을 상당히 높게 설정할 수 있습니다. – Evert

+0

좋은 생각 --- 로그에서 관련 항목을 추가했습니다. 그것은 당신이 추측 할 수있는 것입니다. 나는 여기 아파치의 접근 방식에 동의하지 않는다. –

+0

아파치에 버그를 제출했습니다 : https://issues.apache.org/bugzilla/show_bug.cgi?id=52539 –

답변

0

다음은 추측합니다 :

Apache는 실제로 하위 경로가 리소스로 전송되도록 허용합니다. PHP가있는 예제 :

Foo 바는 index.php를 따라 PATH_INFO로 전송됩니다. 내 생각 엔 HTTP/1.1 400을 잘못 되돌려 보내는 기능과 동일하다는 것입니다.

슬래시가 추가 되었기 때문에 적절한 응답이 실제로 404 찾을 수 없습니다. 개인적으로는 아마도 map/test입니다. bin/to/test.bin.

/test.bin으로 리디렉션하면 아무 문제가 없습니다.

당신은 내가, 내가 등 HTTP 및 WebDAV, CalDAV를, 내 전문 시간의 90 %가 아니라 사람 지출하고있어 그냥 알다시피

+0

응답 해 주셔서 감사합니다. "아파치가 실제로 하위 경로가 리소스로 전송되도록 허용 할 때", 그리고 "Foo bar는 index.php를 따라 PATH_INFO로 보내질 것"이라고 말할 때 당신이 말하는 것을 이해하지 못합니다. 특히 PROPFIND 메서드를 참조하면 RFC 2518에서는 "Depth"헤더를 사용하여 반환 할 자식 리소스를 지정할 수 있으며이를 해석하는 방법에 대해 매우 구체적입니다. RFC 2518에서 PATH_INFO에 대해 말하는 어떤 언어도 찾을 수 없거나 비 콜렉션 리소스가 비슷한 이름을 가진 경우 콜렉션을 다르게 처리해야합니다. –

+0

당신이 제안한대로'/ test.bin /'을'/ test.bin'에 매핑하는 것은 RFC 2518에 완전히 위의 것으로 보입니다. RFC는 "... 자원은 가리 키기 위해 '/'가없이 URI를 받아 들일 수 있습니다 이 경우 그것은 '/', "로 끝나는 URI를 가리키는 응답에서 content-location 헤더를 반환해야하지만, 반대 매핑 (예 : _removing_ 후행 슬래시)을 제공하지 않는다. 여기서 논의되고있다. –

+0

예, 표준에 대해서는 아무 것도 말하지 않습니다. 이것은 분명히 잘못 아파치에 의해 구현됩니다. 당신은 * 왜 * 그것이 잘못 구현 될 수 있는지에 대한 이론적 근거를 요구하고 있었으므로 최선의 선택을하고 있습니다. 이것으로 무엇을 성취하기를 희망합니까? – Evert

2

아파치 2.4에서 WebDAV 서버로 실행과 같은 오류가 발생했다 Windows 2012 및 "mod_negotiation.so"를 사용 중지하는 문제를 해결했습니다.

#LoadModule negotiation_module modules/mod_negotiation.so 
관련 문제