2012-10-11 4 views
5

특정 URL에 대해 ETag를 제공하는 웹 서버가 있습니다. 브라우저가이 url에 대한 요청을 수행하면 해당 URL에 대한 서버의 이전 응답에 포함 된 ETag 값과 함께 "If-None-Match"라는 http 헤더를 제공합니다. 이제 프로그램 적으로 요청 헤더 "If-Modified-Since"를 추가하고 미래 또는 과거 날짜로 설정하면 (중요하지 않음) 브라우저는 "If-None-Match"-header를 보내는 것을 중지합니다. FireFox와 Chrome에서이 기능을 보았습니다 (다른 브라우저에서는 테스트하지 않았습니다). HTTP/1.1 스펙으로 결론을 내릴 수 없다. 왜 이런 일이 생길까요?If-Modified-Since는 브라우저에서 If-None-Match를 무시합니다.

다음은 시나리오를 재현 할 간단한 코드 예제입니다. 이 코드는 서버가 Etag 헤더로 응답한다고 가정합니다. 내가 프로그래밍 방식 "수정 된 경우 - - 이후"요청 헤더를 추가하고 중 미래 또는 과거의 날짜 (중요하지 않음)로 설정하는 경우

var request = new XMLHttpRequest(); 
request.open("GET", someUrl, true); 
request.onreadystatechange = function(){}; 

// This statement makes the browser stop sending the "If-None-Match" header 
request.setRequestHeader("If-Modified-Since", "Sat, 29 Oct 1994 19:43:31 GMT"); 

request.send(null); 
+1

대신 http://greenbytes.de/tech/webdav/draft-ietf-httpbis-p4-conditional-21.html을 읽어 보시기 바랍니다. –

답변

4

이제, 브라우저 "는 전송을 중단 If-None-Match "-header.

그들은해야하지, 서버가 모두 제공하는 경우 Etag입니다 주어진 자원에 대한 마지막 수정 헤더 :

HTTP/1.1 클라이언트 [...] 경우 엔터티 태그 모두와 원본 서버가 제공 한 Last-Modified 값이 이고 캐시 조건부 요청에서 두 유효성 검사기를 사용해야합니다. 이렇게하면 HTTP/1.0 및 HTTP/1.1 캐시가 모두 적절하게 응답 할 수 있습니다.

편집 : XmlHttpRequest.open()를 호출 할 때, 구현이 로컬 캐시 항목을 찾을 수 있다면 다른 사람 If-Modified-SinceIf-None-Match 헤더 사이에 사용하여, nsIHttpChannel를 사용하여 요청을 준비합니다.

SetRequestHeader()If-(Un)Modified-Since 또는 If-None-Match으로 호출하면 두 헤더가 모두 지워지고 값이 설정됩니다.

+0

서버가 Last-Modified 헤더를 제공하지 않습니다. 브라우저가 If-Modified-Since 헤더를 설정해야하는 이유는 IE의 지나치게 공격적인 캐싱을 방지하기 위해서입니다. 내 코드에서 If-Modified-Since를 현재 시간으로 설정하고 "Cache-Control": "max-age = 0"도 설정합니다. – Tore

+0

@Tore 편집을 참조하십시오. 이 작업을 수행하는 것은 XHR 구현입니다. 관련 헤더를 설정하여 내장 캐싱을 무시하면 설정 한 모든 캐시 헤더가 제거됩니다. – CodeCaster

+0

setResponseHeader()가 아니라 setRequestHeader()를 의미합니까? – Tore