Apache-Httpd

禁用 Web 瀏覽器的 CGI 腳本緩衝

  • January 24, 2022

我有一個用 Perl 編寫的小型 CGI 腳本,它以 1 秒的間隔列印從 1 到 10 的數字:

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 範例

但是,對於網路瀏覽器(例如​​ 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 腳本緩衝?也許有一個響應頭允許人們控制這種行為。

您要查找的內容通常是通過 Ajax 完成的。Web 瀏覽器不會按照您希望的方式執行,因為想像一個非常複雜的 HTML/JS/CSS 頁面,您需要渲染 10 次而不是一次。瀏覽器無法提前知道伺服器將要發送什麼數據,因此它們會盡量減少工作量以節省 CPU 週期。

引用自:https://unix.stackexchange.com/questions/687703