如何读取Nginx缓存文件的KEY及以0D 0A 0D 0A结尾的HTTP头
读取Nginx缓存文件中指定范围的HTTP头
实现思路
- 以二进制模式打开Nginx缓存文件,定位到KEY起始位置
0x00000150,跳过KEY内容找到其后的换行符0x0A(即\n),将文件指针移至该换行符的下一个字节。 - 从该位置开始分块读取字节并累积到缓冲区,直到首次遇到分隔符
0x0D 0x0A 0x0D 0x0A(即\r\n\r\n)。 - 截取缓冲区中分隔符之前的内容,解码为字符串得到目标HTTP头。
代码实现
def read_nginx_cache_http_header(cache_file_path): # 定义HTTP头结束的分隔符:\r\n\r\n delimiter = b'\x0d\x0a\x0d\x0a' # KEY在缓存文件中的起始偏移 key_start_offset = 0x150 with open(cache_file_path, 'rb') as f: # 定位到KEY的起始位置 f.seek(key_start_offset) # 跳过KEY内容,找到KEY后的第一个0x0A换行符 while True: byte = f.read(1) if not byte: # 文件提前结束,未找到目标换行符 return None if byte == b'\x0a': break # 开始读取HTTP头内容,直到遇到分隔符 buffer = b'' while True: # 分块读取,平衡读取效率与内存占用 chunk = f.read(1024) if not chunk: # 文件结束,未找到分隔符 return None buffer += chunk # 检查缓冲区是否包含目标分隔符 delimiter_idx = buffer.find(delimiter) if delimiter_idx != -1: # 截取分隔符之前的字节作为HTTP头原始数据 header_bytes = buffer[:delimiter_idx] break # 解码为字符串,HTTP头默认ASCII编码,用replace处理非标准字符避免解码崩溃 return header_bytes.decode('utf-8', errors='replace') # 调用示例 if __name__ == '__main__': target_header = read_nginx_cache_http_header('/path/to/your/nginx/cache/file') if target_header: print("读取到的HTTP头:") print(target_header) else: print("未找到目标HTTP头或缓存文件格式异常")
关键细节说明
- 二进制模式读取:必须用
rb模式打开文件,直接操作原始字节,避免文本模式自动转换换行符导致的位置偏移。 - 分块缓冲读取:避免一次性读取大文件占用过多内存,同时通过缓冲区累积数据,确保能准确检测到跨块的分隔符。
- 容错处理:加入文件提前结束的判断,避免缓存文件损坏或格式异常时程序崩溃;解码时用
errors='replace'兼容非标准字符。
内容的提问来源于stack exchange,提问作者smaxx1337
相关产品推荐
相关产品推荐

