WebブラウザのCGIスクリプトバッファリングを無効にする

WebブラウザのCGIスクリプトバッファリングを無効にする

1秒間隔で1から10までの数字を印刷するPerlで書かれた小さなCGIスクリプトがあります。

root@debian-s-1vcpu-1gb-fra1-01:~# cat /usr/lib/cgi-bin/test
#!/usr/bin/perl

use strict;
local $|=1;

print "Content-encoding: none\nContent-type: text/plain\n\n";
#print "Content-type: text/plain\n\n";

for ( my $i = 1 ; $i <= 10 ; $i++ ) {
    print "$i\n";
    sleep(1);
}
root@debian-s-1vcpu-1gb-fra1-01:~#

次のコマンドを使用すると、スクリプトは期待どおりに機能しますcurl

カール 7.64.0 例

ただし、Webブラウザ(Chromium 88.0.4324.182やFirefox 78.13.0esrなど)を使用すると、ページが10秒間読み込まれた直後に1から10までの数字が表示されます。 Webブラウザのリクエストとレスポンスヘッダは次のとおりです。

Firefox 78.13.0esr はい

curl上記の例と同じ要求ヘッダーを使用して実行しても、Firefox数字は次のように1秒間隔で印刷されます。

$ curl -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H 'Accept-Encoding:
gzip, deflate' -H 'Accept-Language: en-US,en;q=0.5' -H 'Connection: keep-alive' -H 'Host: 164.90.236.255' -H 'Upgrade-Insecure-Requests: 1' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0' -v http://164.90.236.255/cgi-bin/test
* Expire in 0 ms for 6 (transfer 0x55b238016fb0)
*   Trying 164.90.236.255...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x55b238016fb0)
* Connected to 164.90.236.255 (164.90.236.255) port 80 (#0)
> GET /cgi-bin/test HTTP/1.1
> Host: 164.90.236.255
> Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
> Accept-Encoding: gzip, deflate
> Accept-Language: en-US,en;q=0.5
> Connection: keep-alive
> Upgrade-Insecure-Requests: 1
> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
>
< HTTP/1.1 200 OK
< Date: Mon, 24 Jan 2022 12:19:56 GMT
< Server: Apache/2.4.25 (Debian)
< Content-encoding: none
< Keep-Alive: timeout=5, max=100
< Connection: Keep-Alive
< Transfer-Encoding: chunked
< Content-Type: text/plain
<
1
2
3
4
5
6
7
8
9
10
* Connection #0 to host 164.90.236.255 left intact
$ 

サーバーがApache 2.4.25無効になっていますmod_deflate

この動作の原因は何ですか? WebブラウザでCGIスクリプトのバッファリングを無効にするにはどうすればよいですか?たぶん、人々がこの動作を制御できるようにする応答ヘッダーがあるかもしれません。

答え1

あなたが探しているのは通常Ajaxを通して行われます。一度ではなく10回レンダリングする必要がある非常に複雑なHTML / JS / CSSページを想像すると、Webブラウザは望みどおりに機能しません。ブラウザはサーバーがどのデータを送信するかを事前に知ることができないため、CPUサイクルを節約するためにできるだけ少ない操作を実行しようとします。

関連情報