一、问题描述
FB开发者后台突然收到一封违规情况的邮件,并且要求解决给的时间很短,大体上的描述如下:
1、确保在应用面板内填写有效的隐私协议政策链接。
2、cURL隐私政策网址,确保系统返回200 OK 状态码
3、确定隐私权政策是有外部网址或者是Facebook Canvas网址托管,我们不支持facebook.com托管的隐私权政策。
尝试换新的url,点击提交也无法提交成功,会有错误提示。
二、排查问题
按着fb提示的这几个点进行排查,使用curl,可以确保返回的是200 OK,而且链接有效,是由自己服务器托管的,与facebook.com无关。点击按钮时弹出弹窗无法提交的问题,大概率是由于fb自己网页的bug导致,因为多次尝试,多网址尝试都失败了,在fb的开发者支持论坛也查询到了一些同样的提问,但是没有官方人员答复。这个问题经过了一段时间的等待后,最终终于以莫名奇妙的方式提交成功了。
本来问题到此看似解决了,但是其实存在一个疑问:为什么地址可用,却会突然莫名被认为是违规呢?
于是找到FB官方提供的一个分享调试工具:
通过测试竟发现,我们的隐私权政策的网址返回的竟不是200 OK,而是206 Partial Content。
通过查Http返回code的信息可知,206的状态码和Accept-Ranges响应头有关,服务器发送这个头的目的是让客户端知道服务器接受以字节为单位的部分内容请求。
通过这个思路,使用postman,给请求加一个header参数:
Key : Range
Value: bytes=1-1023
在Postman也成功的复现了206。
三、修复方式
修复方式自然是改动服务器逻辑,使其不返回206 Partial Content。
由于这个url是单纯用来托管静态文本页面的,不涉及其他什么资源,所以可以在服务器配置
Header unset Accept-Ranges
这将从响应头中删除“Accept-Ranges”字段,从而禁用范围请求。这样,当用户请求该页面时,服务器将返回完整的200响应,而不是206。请注意,这可能会影响到其他资源的范围请求,因此请谨慎使用。
四、结论
这次的问题其实存在两个方面的问题:
1、一方面是fb自身的问题,网站出现了bug,无法提交只提示了一个笼统的弹窗,后续又莫名恢复
2、另一方面fb使用了范围请求,但是却规定不能返回206,只能200。
因此我们自身服务器强制关闭对范围请求的支持,保证只返回200,以防止后续又出现问题。