Apache-Httpd
禁用 Web 瀏覽器的 CGI 腳本緩衝
我有一個用 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
:但是,對於網路瀏覽器(例如 Chromium 88.0.4324.182 或 Firefox 78.13.0esr),頁面載入 10 秒,然後立即顯示 1 到 10 的數字。Web 瀏覽器的請求和響應標頭如下所示:
即使我使用與上面範例
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 週期。