2011-05-08 3 views
4
<VirtualHost *:80> 
    ServerAdmin [email protected] 
    DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs" 
    ServerName dev.dom.com 
    ServerAlias dev.dom.com 
    ErrorLog "logs/dev.dom.com-error.log" 
    CustomLog "logs/dev.dom.com-access.log" common 
    PassEnv CLUSTER 
    Header always set X-Cluster "%{CLUSTER}e" 
</VirtualHost> 

여기가 저의 구성입니다. "X-Cluster"의 헤더로 전달되는 클러스터가 어떤 것인지 알려주는 환경 변수가 있습니다. 200 또는 404 응답에서이 값을 반환하지만 304 Not Modified 응답은 다른 적절한 Apache 헤더를 반환하더라도 헤더를 반환하지 않습니다.304 응답이 mod_headers가있는 아파치의 사용자 정의 헤더를 설정하지 않았습니다.

304 응답 중에 헤더를 어떻게 설정합니까?

+0

장시간 촬영했지만 해결책을 찾았습니까? – juan

+0

http://stackoverflow.com/questions/17812347/how-to-add-a-custom-header-despite-a-rewriterule-redirecting-to-304 – juan

답변

1

아파치는 HTTP 응답에 대한 304 응답의 응답 헤더를 수정하는 것을 명시 적으로 금지합니다. 이 유형의 응답 이름은 "수정되지 않음"입니다. 아파치의 필터 아키텍처를 사용하거나, 사용자 정의 모듈을 작성하거나, 아마도 mod_perl을 사용하여이 동작을 수정할 수는 있지만, 잘못했을 가능성이 큽니다.

7

현재 HTTP 사양에 따르면 304 Not Modified 응답은 특정 예외를 제외하고는 엔터티 헤더를 반환하지 않습니다. section 10.3.5 of RFC 2616에서 인용 :

조건부 GET이 강력한 캐시 유효성 검사기를 사용하면 응답에 다른 엔터티 헤더를 포함하면 안됩니다. 그렇지 않은 경우 (즉, 조건부 GET이 약한 유효성 검사기를 사용함) 응답은 다른 엔티티 헤더를 포함해서는 안됩니다 (MUST NOT). 이렇게하면 캐시 된 엔티티 본문과 업데이트 된 헤더 간의 불일치가 방지됩니다.

그리고 불행히도 모든 확장 헤더는 classified as entity headers입니다.

그러나 RFC 2616을 대체하기위한 HTTPbis 초안의 미래를 살펴보면 규칙이 훨씬 완화되었습니다. section 4.1 of the Conditional Requests spec에서 인용 :

을 304 응답의 목표 때문에하는 것은 수신자가 이미 하나 이상의 캐시 된 표현이있는 경우를 제외하고 나열된 필드 위의 이외의 표현 메타 데이터를 생성해서는 안하는 보낸 사람 정보 전송 을 최소화하는 것입니다 상기 메타 데이터는 캐시 갱신을 안내하기 위해 존재한다.

그래서 표현 메타 데이터로 분류되지 않는 맞춤 헤더를 설정하는 경우 새 규칙에서 합법적 인 것으로 간주됩니다.

그렇다면이 사양에 무엇이 쓰여 있더라도 Apache가 지원할 수있는 사항을 처리해야합니다. 그리고 소스 코드에서 보았던 것에서 사용자 정의 헤더는 여전히 304 응답에서 지원되지 않습니다. 보다 구체적

코드 :

헤더 여과하는 대신 파일 /modules/http/http_filters.cap_http_header_filter 함수에

if (r->status == HTTP_NOT_MODIFIED) { 
    apr_table_do((int (*)(void *, const char *, const char *)) form_header_field, 
       (void *) &h, r->headers_out, 
       "Connection", 
       "Keep-Alive", 
       "ETag", 
       "Content-Location", 
       "Expires", 
       "Cache-Control", 
       "Vary", 
       "Warning", 
       "WWW-Authenticate", 
       "Proxy-Authenticate", 
       "Set-Cookie", 
       "Set-Cookie2", 
       NULL); 
} 

은 "수정되지"응답을 반환 (304) 위의 헤더 목록 만 통과합니다 (예 : 날짜서버과 같이 자동 생성 된 일부 헤더 제외). 그리고 내가 볼 수 있듯이이 코드를 사용하여 동작을 변경하는 쉬운 방법이없는 것처럼 보입니다.

결론은 현재 아파치에서는 여전히 가능하지 않다는 것입니다. 다른 헤더에 대한 지원을 요청하는 메시지는 적어도 one bug report이지만 CORS 헤더 용입니다. 행운을 빌어 일반 헤더를 지원하는 데 도움이 될 수 있습니다.

하지만 그렇게 될 때까지 내가 제안 할 수있는 유일한 해결책은 서버를 직접 패치하는 것입니다. 소스에서 다시 빌드하지 않으려는 경우 바이너리를 직접 패치 할 수도 있습니다. 예를 들어 하나 또는 두 개의 새 헤더 만 지원해야하는 경우 사용할 가능성이없는 기존 헤더 중 일부를 바꿀 수 있습니다 (예 : Set-Cookie2, 어쨌든 사용되지 않음).

Apache bin 디렉토리에서 바꿀 헤더 이름을 찾으십시오 (Windows에서는 libhttpd.dll). 그런 다음 이진 편집기를 사용하여 null로 끝나는 문자열을 새 헤더 이름으로 바꿉니다. 물론 바꾸려는 헤더보다 길이가 짧거나 짧아야합니다.

다른 운영 체제에 대해서는 잘 모릅니다.하지만 Windows에서 테스트 해봤는데 작동하는 것 같습니다. 분명히 끔찍한 해킹이지만, 필사적이라면 옵션이라고 생각할 수도 있습니다.

관련 문제