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

Python CGI重定向报"End of script output before headers"如何解决?

解决方案

错误原因

  • webbrowser.open()是调用服务器本地的浏览器程序,完全不适用HTTP服务场景,无法给访问脚本的用户浏览器下发重定向指令
  • 没有输出符合CGI规范的响应头,所以触发End of script output before headers报错

正确实现代码

CGI规范下实现重定向只需要返回Status状态头和Location跳转地址头,再输出空行分隔头和响应体即可,以下是包含点击追踪逻辑的完整可运行代码:

#!/usr/bin/python3
import cgi
import urllib.parse
from datetime import datetime

# 1. 获取查询参数
form = cgi.FieldStorage()
target_url = form.getfirst('rurl', 'https://www.example.com') # 无rurl参数时的默认跳转地址
utm_content = form.getfirst('utm_content', '')

# 2. 点击追踪逻辑(示例写入本地日志,可替换为写入数据库)
log_path = '/var/log/redir_click.log'
client_ip = cgi.os.environ.get('REMOTE_ADDR', 'unknown')
log_line = f"{datetime.now().isoformat()}\t{client_ip}\t{utm_content}\t{target_url}\n"
with open(log_path, 'a', encoding='utf-8') as f:
    f.write(log_line)

# 3. 输出CGI重定向响应头
print('Status: 302 Found')
print(f'Location: {target_url}')
print('') # 空行是CGI规范要求的头和体的分隔标识,重定向场景无需额外输出响应体

配置注意事项

  • 给脚本添加执行权限:chmod +x /var/www/cgi-bin/redir.py
  • 给日志文件赋Apache运行用户权限:touch /var/log/redir_click.log && chown www-data:www-data /var/log/redir_click.log
  • 统计点击量推荐用302临时重定向,避免浏览器缓存301永久重定向响应,导致后续点击不会请求脚本、丢失统计数据
  • 建议添加目标域名白名单校验,判断target_url的域名是否在你允许的域名列表内,避免被恶意利用作为钓鱼跳转跳板

内容的提问来源于stack exchange,提问作者merlin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 23:45:06