2010-12-27 5 views
3

Apache2에서 mod_deflate를 사용할 때 아파치는 gzipped 콘텐츠를 청크하여 Transfer-encoding : chunked 헤더를 설정합니다. 이로 인해 다운로드 시간이 빨라지지만 진행률 표시 줄을 표시 할 수 없습니다.아파치가 gzipped 콘텐츠를 청크하지 못하도록

PHP에서 직접 압축을 처리하는 경우 먼저 gzip으로 압축을 풀고 Content-Length 헤더를 설정하여 사용자에게 진행률 표시 줄을 표시 할 수 있습니다.

아파치의 기본 동작을 변경하는 설정이 있습니까? 아파치는 응답을 청킹하는 대신 Content-Length 헤더를 설정하여 압축을 직접 처리 할 필요가 없습니까?

답변

1

sendBufferSize으로 재생하면 하나의 청크에 응답을 포함 할만큼 큰 값을 얻을 수 있습니다. 설정 : ("는 HTTP/1.0 클라이언트로 전송 - 코딩을 보낼 안 서버."그래서 청크되지 않음)

그런 다음 chunked content, 당신은 HTTP/1.0 응답을 강제 할 수있는 HTTP/1.1 프로토콜의 일부입니다 아파치 설정에서 force-response-1.0. 그러나 PHP는이 설정을 깨트 렸습니다, PHP의 오랜 버그로, workaround이 있습니다.

우리는 청크 분할 컨텐츠를 거 방지 헤더와 함께 클라이언트 측의 요청을 수정하려고 수 있지만, W3C는 말한다 : "모든 HTTP가/1.1 응용 프로그램을 수신 및 디코딩 할 수 있어야한다은" "을 전송 코딩"청크 그래서 'Accept'와 같은 헤더가있어 서버가 콘텐츠를 청취하는 것을 방지 할 수 있다고 생각하지 않습니다. 그러나 HTTP/1.0으로 요청을 설정하려고 할 수도 있습니다. 요청의 헤더가 아니며, 첫 번째 줄입니다. jQuery로 가능해야합니다.

마지막으로 HTTP/1.0에는 큰 것이 하나도 없으며 '호스트'헤더가 필수는 아닙니다. 이름 기반 가상 호스트로 작업하는 경우 HTTP/1.0의 요청이 여전히 '호스트'헤더를 사용하는지 확인하십시오.

편집 : 해결 방법에 나와있는 기술을 사용하면 PHP 코드에서 Apache env를 조정할 수 있음을 알 수 있습니다. 이것은 gzip으로 압축 된 특수한 내용에 대해서만 1.0 모드를 강제하는 데 사용할 수 있습니다. HTTP/1.0으로 응용 프로그램을 완료하지 못하게하거나 요청 모드를 사용하여 gzip 요청에 대해 HTTP/1.0을 설정하지 않아야합니다.

+0

감사합니다. 그러나이 모든 것은 PHP에서 직접 압축을 처리하는 것보다 복잡합니다. – yclevine

+0

청크 분할 된 응답에서 content-lenght 헤더 설정을 강제 실행하려고 시도 했습니까? 복잡성에 대해서는 간단한 "apache_setenv ('force-response-1.0', 'true')를 사용하지 않는다고 생각합니다." 귀하의 콘텐츠를 gzipped로 렌더링하는 PHP 스크립트는 어렵지만, 귀하에게 달려 있습니다 :-) – regilero

+0

콘텐츠 길이 및 청크 전송 인코딩은 함께 사용할 수 없습니다. 복잡성에 대해서, 나는 그저 PHP에서 압축을 처리 할 수 ​​있다는 것을 의미했다. – yclevine

관련 문제