PHP에서 echo를 사용하여 큰 바이너리 문자열을 HTTP 응답으로 출력할 때 서버가 잘못된 응답을 반환했습니다.
P粉328911308
2023-08-28 10:26:38
<p>다음 코드를 사용하여 일부 대규모 바이너리 배열을 HTTP 응답으로 출력하려고 합니다. </p>
<pre class="brush:php;toolbar:false;">$bin = NULL;
$strLenToOutput = 8000;
for ($i=0; $i < $strLenToOutput; $i++) {
$bin .= pack("C", 1);
}
header('콘텐츠 설명: 파일 전송');
header("콘텐츠 유형: 애플리케이션/옥텟 스트림");
header("콘텐츠 처리: 첨부 파일; 파일 이름=test.bin");
header("콘텐츠 길이: 파일 크기=" . strlen($bin));
header("캐시 제어: no-cache");
에코 $bin;</pre>
<p>출력할 문자열이 8000 이하로 비교적 짧은 경우 위 코드는 정상적으로 작동합니다. 그러나 문자열 길이가 8001로 늘어나면 Postman에서 다음 오류가 발생합니다. </p>
<pre class="brush:php;toolbar:false;">분석 오류: 서버가 잘못된 응답을 반환했습니다</pre>
<p>Apache V2.4.46에서 PHP7.4를 실행하고 있으며 모든 설정이 기본값입니다. </p>
<p>내가 여기서 뭘 잘못하고 있는 걸까요? 변경해야 하는 것이 PHP 코드입니까, 아니면 Apache2의 일부 설정입니까? </p>
<p>안내해 주시기 바랍니다. 미리 감사드립니다. </p>
<p>업데이트: 파일 길이를 설정하는 다음 줄을 제거하면 PHP 코드가 제대로 작동합니다. 문제는 PHP가 이 부분을 스스로 처리하도록 해야 한다는 것입니다. </p>
<pre class="brush:php;toolbar:false;">//header("Content-Length: filesize=" . strlen($bin));</pre></p>
문제는 Content-Length 헤더가 설정되는 방식입니다. 원래 코드는 헤더를 설정합니다
으아악다음과 같이 설정해야 합니다:
으아악헤더의 추가 텍스트 "filesize="는 클라이언트의 응답 구문 분석을 혼란스럽게 할 뿐입니다. Content-Length가 8000보다 작거나 같으면 클라이언트가 복구할 수 있는 방법이 있을 수 있지만 Content-Length가 8001보다 크거나 같으면 상황을 처리할 수 없습니다