IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者
首页 / 小小子
IT 2015-09-04 21:25:14 / 累计浏览 1,760

记一次因错误的500页面引发的血案

这篇文章记录了一次线上故障的完整排查过程。某业务活动页的一个固定链接,会导致部分用户被强制跳转至首页,且一旦跳转就“卡”在首页,无法再访问原链接。 排查过程颇具戏剧性:开发者通过抓包发现,浏览器根本没请求那个出问题的链接,而是直接请求了首页。查看缓存,其内容竟是一句 `meta http-equiv="refresh"` 跳转代码。这个行为在开发环境无法复现,最终矛头指向了生产环境的 Nginx 配置。 根因在于生产环境配置了 `error_page 500 = /50x.html;`,而这个自定义的 50x.html 页面内容恰好就是跳转到首页的 meta 标签。在系统上线替换文件期间,可能因文件不完整触发了 500 错误,导致浏览器缓存了这个跳转页面,从而陷入无限循环。 文章给出的解决方案很明确:一是为这个错误页面添加禁止缓存的 HTTP 头,从根源上阻止缓存;二是提供一个真正友好的 500 错误提示页,而非简单粗暴地跳转。这个案例生动地说明了,一个看似不起眼的、设计不佳的错误处理页面,在特定条件下可能演变成影响用户体验的持续性故障。

本机暂存
IT 2014-12-29 00:10:12 / 累计浏览 2,020

ios webview 相关

这篇讲的是开发者在iOS原生开发中,通过Objective-C操作WebView加载页面时遇到的两个典型“坑”及其排查过程。 第一个问题是关于携带Cookie的WebView加载。当需要传递带有HTTPOnly标记的登录Cookie时,发现NSHTTPCookie本身并不支持设置这个标记。作者的解决方案是绕开API限制,手动在请求头中拼接Set-Cookie字段,并详细演示了如何在加载前清理旧Cookie、在加载后构建并存储带有httponly标记的Cookie对象,确保了安全性和功能同时生效。 第二个问题涉及URL的细微变化。当页面内的JavaScript行为导致URL从“index.php”变为“index.php#”时,WebView的回调机制出现了异常:只会触发`shouldStartLoadWithRequest`,而不会触发`webViewDidFinishLoad`。这意味着如果开发者在此回调中管理“加载中”提示框,该弹窗可能无法自动隐藏,导致用户体验中断。文章指出了这个容易被忽略的加载状态管理时机问题。 文章最后坦言可能有更好的解决方案,并鼓励读者交流分享,体现了在复杂移动端环境中,对WebView这类“水很深”的组件进行细致调试与经验积累的重要性。

本机暂存
IT 2013-05-01 22:34:51 / 累计浏览 5,100

HTTP 正向代理与反向代理

这篇讲的是代理技术中正向与反向的核心区别。作者从大家最熟悉的“翻墙”场景切入,解释了正向代理由客户端主动设置(比如配置VPN),用于突破访问限制或进行网络管控,就像通过一台能上网的“网管”机器连接外部世界。 而反向代理则完全不同,它部署在服务器端,用户毫无感知。文中特别指出,反向代理主要用于两件事:负载均衡,以及通过地理位置优化提升性能——比如电信用户通过代理服务器经内部光纤访问网通资源,速度会快得多。 文章用电信用户获取文件的对比例子,清晰说明了反向代理如何通过服务器端的资源整合来改善用户体验。最后总结道,两者最根本的差异在于:正向代理由客户端配置,反向代理则由服务端对服务器间通信进行代理,实现负载分配与访问加速。 文末提到作者参考了《HTTP权威指南》,其个人对“防火长城”作用的理解也为我们提供了一个观察网络代理不同角色的有趣视角。

本机暂存
IT 2013-05-01 18:41:08 / 累计浏览 6,060

DNS解析过程及DNS TTL值

这篇从DNS劫持和解析错误这些常见痛点出发,系统拆解了域名背后的运作机制。文章首先明确了全球仅13台根域名服务器的核心地位,任何域名解析都需从这里获取顶级索引。 接着,它用六个步骤清晰复现了从客户机发起请求到本地DNS服务器完成查询的全过程。其中,递归查询与迭代查询的差异被直观呈现:前者是本地DNS一路负责到底,后者则是逐级向下获取地址。 文章重点阐述了DNS TTL(生存时间)的概念——这条记录在各级DNS服务器中的缓存时长。针对域名解析IP变更后如何加速更新的问题,作者给出了一个实用的分步操作建议:先将TTL值调至最低(如60秒),等待各地缓存过期后再修改解析记录,最后恢复正常TTL。这种从理论到实践的过渡,让技术原理落到了具体操作层面。文末配合的全球根服务器分布图与解析流程图,也帮助读者建立了直观的理解。

本机暂存
IT 2013-05-01 17:40:52 / 累计浏览 5,520

简单理解Memcached的Slab Allocation

这篇讲的是Memcached如何用Slab Allocation机制管理内存。作者从内存分配的基本问题切入,解释了这套机制的核心:它预先将内存划分为大小固定的Page(默认1MB),再将每个Page切成相同尺寸的Chunk,相同尺寸的Chunk集合就构成了一个Slab。 这种预分配和分组的方式,能有效减少动态分配内存时产生的碎片。文章进一步指出,通过启动参数`-f`可以调整Growth Factor(默认1.25),它决定了相邻Slab中Chunk尺寸的倍增关系。不过,Slab Allocation并非完美:当实际数据尺寸与Chunk大小不匹配时,会产生内部碎片;当一个Slab无法被其Chunk大小整除,或是某些尺寸的Slab根本没被使用时,也会造成内存浪费。 文章通过结构图和工具截图,直观展示了Slab、Page与Chunk的关系,以及Growth Factor对不同Slab中Item尺寸的影响,清晰剖析了这个内存管理方案的利与弊。

本机暂存
IT 2013-04-06 22:59:21 / 累计浏览 3,160

思考题:如下场景如何设计mongo collection

这篇探讨的是一个实际场景下的 MongoDB 集合设计问题:如何记录用户每次登录的业务标识、IP 及时间,并高效查询特定用户在特定业务下的某个 IP 是否已存在。 作者给出了两种思路并进行了对比。方案一采用扁平结构,为每次登录记录一条独立文档,结构清晰,查询时通过 `findOne` 直接定位。方案二则将同一用户同一业务下的所有登录记录聚合到一个文档中,将 IP 和时间存储为子文档数组,这在查询特定 IP 时语法略显复杂。 文章的核心矛盾点在于如何权衡查询的便捷性与应对新需求的灵活性。当需求变更为“每个用户同一业务只保留最新5条记录”时,方案一需要额外的计数与删除操作,而方案二则更利于在应用层(如 PHP)对数组进行裁剪后整体更新。作者最终选择了后者,并通过客户端脚本管理数组元素,再使用 `upsert` 操作同步回数据库。这反映了在 NoSQL 设计中,有时需要结合应用逻辑来弥补数据库层功能的不足。

本机暂存
IT 2012-01-27 18:59:47 / 累计浏览 11,280

JSONP与POST方式请求

这篇讲的是AJAX跨域请求中两种截然不同的思路:JSONP和POST。 文章开篇就点明JSONP并非官方标准,而是一个巧妙的“协议”,它利用了浏览器允许加载外部脚本(`