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
相关产品推荐
相关产品推荐

