You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 08:15:06