如何在Apache中禁用输出缓冲实现渐进渲染?优先用.htaccess
解决Apache下CGI脚本输出缓冲问题(HTTP/2环境)
脚本层面调整(优先推荐)
在脚本中添加特定响应头强制禁用缓冲,并确保每次输出后主动刷新缓冲区:
修改后的示例脚本:
#!/usr/bin/env python3 # -*- coding: utf8 -*- import sys import time # 输出响应头,明确禁用缓存和启用分块传输 print("Content-Type: text/html") print("Transfer-Encoding: chunked") print("Cache-Control: no-cache, no-store, must-revalidate") print("Pragma: no-cache") print("Expires: 0") print() # 空行分隔响应头与正文 print("<!DOCTYPE HTML>") print("<html lang=\"en\">") print("<head>") print("<title>Testing ...</title>") print("</head><body>") print("<p>Nothing to see here yet</p>") sys.stdout.flush() # 强制推送当前内容到浏览器 time.sleep(5) print("<p>Done</p>") sys.stdout.flush() print("</body></html>") sys.stdout.flush()
关键改动:
- 添加
Transfer-Encoding: chunked头,告诉Apache以分块方式传输内容,避免整体缓冲 - 加入缓存控制头,防止浏览器或中间代理缓存内容
- 每次输出后调用
sys.stdout.flush(),确保Python层面的缓冲区被清空
.htaccess配置方案
如果无法修改脚本,可在cgi-bin目录的.htaccess文件中添加以下配置:
# 禁用gzip压缩,避免压缩过程中的缓冲 SetEnv no-gzip 1 # 禁用Apache的CGI输出缓冲(需Apache 2.2+,且服务器允许.htaccess修改FileInfo) CGIBufferSize 0 # 全局设置缓存控制头 Header set Cache-Control "no-cache, no-store, must-revalidate" Header set Pragma "no-cache" Header set Expires "0"
注意事项:
- 需确保Apache已启用
mod_cgi和mod_headers模块 - 如果
CGIBufferSize不生效,检查httpd.conf中对应目录的AllowOverride是否设置为FileInfo或All
HTTP/2环境的额外说明
HTTP/2本身会对传输进行优化,但明确指定Transfer-Encoding: chunked是让Apache实时推送内容的关键——它会强制Apache将生成的内容立即封装成HTTP/2帧发送,而非等待脚本执行完毕。
测试时可使用curl -v https://elnadisc.com/cgi-bin/test.cgi,查看响应头是否包含Transfer-Encoding: chunked,并观察是否在5秒内先收到第一部分内容。
内容的提问来源于stack exchange,提问作者Edward Falk
相关产品推荐
相关产品推荐

