2010-01-21 5 views
41

다음 HTTP 1.1 헤더 란 무엇을 의미합니까? 경우 - 없음 - 경기HTTP 헤더는 무엇입니까?

은 : *

강한 또는 약한있는 ETag 또는 ETag를 심지어 목록을 사용할 때 나는 그것을 이해하지만, 나는 그것이 소용이 understant하지 않는 스타를 사용하는 경우 (*) .

편집 : 만약 "If-None-Match : *"에 어떻게 답할 것인지를 보여주는 의사 코드 (PHP 코드도 좋음)가 있으면 좋을 것입니다.

답변

36

답변은 다음과 같습니다.

한다고 가정 우리는

If-None-Match: * 
If-Modified-Since: <yesterday date> 

을받은 그리고 페이지가 오늘 을 변경되었습니다.

우선, *에서 "리소스가 있고 조건 (2)가 충족되면 304를 반환합니다"라고 말합니다. 좋아, 리소스가 존재하지만 조건 (2)는 "날짜가 현재보다 나중 인 경우에만 304를 반환합니다"라고 명시합니다. 따라서이 조건은 충족되지 않으며 페이지가 완전히 전달됩니다. (더 If-None-Match 없었다 것처럼) 자원이 요청시에 존재하지 않았다면

우리가 If-Modified-Since받지 못한 경우, 응답이

(304)을했을 것이다, 우리는 적절한 코드를 반환 한 것입니다.

304는 GET 및 HEAD 요청에 대해서만 응답해야하며 모든 캐시 관련 응답 헤더가 있어야합니다. 다른 모든 유형의 요청에 대해서는 서버가 응답해야합니다 (사전 조건 실패).

도움이 되길 바랍니다.)

+0

If-None-Match에서 *를하면 304를 발행하는 유일한 방법은 If-Modified-Since가 설정되고 일치하는 경우입니다. – AlexV

+1

그 중 하나 또는'If-Modified-Since'가 전혀 없습니다. 그래서 두 가지 방법이 있습니다. –

10

RFC 2616 (HTTP 1.1)에서 인용 : "*"주어진하고 현재의 엔티티가 해당 자원이 존재하는 경우 그래서 자원의 이유로하도록 요구하지 않는

..., 서버가 요청 된 방법을 수행해서는 안 수정 날짜가 요청의 If-Modified-Since 헤더 필드에서 제공된 것과 일치하지 않습니다.

RFC는 요청을 수행하는 대신 GET 및 HEAD 요청에 대해 304 (수정되지 않음)로 응답해야하며 다른 모든 요청 유형에 대해 412 (선행 조건 실패)로 응답해야한다고 설명합니다. . 그러나 서버에 실제로 요청 된 리소스의 일부 버전이있는 경우에만 해당됩니다. 엔티티가없는 경우 으로 처리해야합니다 (아무 것도 없기 때문에 아마도 404로 처리해야합니다).

요청을 처리하려면 먼저 해당 헤더 이없는 경우 서버가 수행 할 작업을 확인하십시오.. 해당 요청의 결과가 이 아니고이 2xx 또는 304가되는 경우 요청을 정상적으로 처리하십시오. 그러나 요청 의 결과가이 2xx 또는 304가되면 If-None-Modified 경우를 처리하십시오. 스타 일 때, 즉시 304를 반환합니다 (If-Modified-Since가 트럼프하지 않는 한). 하나 이상의 엔티티 태그 인 경우 해당 태그 중 하나가 응답으로 사용할 계획의 태그와 일치하는지 확인합니다. 일치하는 것이 있으면 304를 반환합니다. 일치하는 항목이 없으면 정상적으로 처리하십시오. 나중에 RFC에서

는 더있다 :

"만약 - 없음 - 경기 : *"의 의미 표현은 원 서버가 선택한 경우이 방법을 수행 할 수 없습니다해야한다는 것입니다 (부산물 또는 캐시, 가능한 경우 Vary 메커니즘을 사용함, 섹션 14.44 참조)이 존재하고, 표현이 존재하지 않으면 수행되어야한다. 이 기능은 PUT 작업 사이의 레이스를 방지하는 데 유용합니다. 이다

은, 별은 클라이언트가 말할 수 있습니다 "이미이 파일의 버전 가 있다면이 파일을 넣지 마십시오."

+3

그리고 이것은 일반 영어로 무엇을 의미합니까? *가 제공되면 나는 페이지를 정상적으로 제공한다 (304없이). If-Modified-Since가 제공 되더라도 ... – AlexV

관련 문제