Python基于Socket搭建HTTP服务器 本地访问时图片无法加载问题咨询
图片无法加载的问题排查与修复
核心问题原因
- 页面img标签的
src直接写入了Windows本地磁盘绝对路径。浏览器内置安全策略明确限制:通过HTTP协议加载的网页,无权直接读取用户本地文件系统的资源,这类请求会被浏览器直接拦截,根本不会发出网络请求到服务端。 - 服务逻辑不支持多资源加载场景:当前代码只处理1次客户端连接,发送完HTML响应后就直接关闭socket退出服务。浏览器解析完HTML内容后,会自动发起新的请求获取页面内嵌的图片资源,此时服务端已经停止运行,无法接收并响应图片请求。
- HTTP响应头存在格式规范问题:
- 拼接的
Date头在冒号后没有留空格,且错误将GMT标识硬拼在时间字符串尾部,不符合HTTP协议的头语法要求 - 所有响应都没有携带
Content-Length字段,浏览器无法准确判断响应体的结束位置 - 响应头写死了
text/html的Content-Type,即便后续要返回图片类资源,也会因为头标识不匹配导致浏览器无法正确解析内容
- 拼接的
修复操作要点
- 改写img标签的
src为基于当前HTTP服务的相对资源路径,例如/crying_cat_with_thumb_up.jpg,不要直接填写本地磁盘的绝对路径 - 调整服务逻辑为循环接收客户端连接,根据请求的资源路径做分支响应:如果请求的是页面根路径,就返回HTML内容;如果请求的是映射的图片路径,就读取本地jpg文件的二进制内容,设置对应的响应头(图片资源的
Content-Type为image/jpeg)后再返回给客户端 - 按HTTP协议规范修正响应头:
- 补全每个头字段名称和值之间的空格,按标准格式拼装Date头
- 每次响应前计算响应体的实际字节长度,在响应头中添加
Content-Length: <长度值>字段 - 根据返回的资源类型动态设置Content-Type值,不要固定写死HTML类型
内容的提问来源于stack exchange,提问作者libano91
相关产品推荐
相关产品推荐

